The following line creates a named ValueTuple
:
var tuple = (a:1, b:2, c:3, d:4, e:5, f:6);
Value types can not be passed around efficiently. Does C# 7
offer a way to create named tuples of the Tuple
type?
The following line creates a named ValueTuple
:
var tuple = (a:1, b:2, c:3, d:4, e:5, f:6);
Value types can not be passed around efficiently. Does C# 7
offer a way to create named tuples of the Tuple
type?
If you mean if there's a way to attach other names to the properties of System.Tuple<...>
instances, no there isn't.
Depending on why you want it, you might get around it by converting System.Tuple<...>
instances to System.ValueTuple<...>
instances using the ToValueTuple
overloads in TupleExtensions and back using the ToTuple
overloads.
If you don't really need the tuples, you can deconstruct them into discrete variables using the Deconstruct
overloads or the var (v1, .., vn) = tuple
deconstruction syntax.
Itemn
, named tuples are, well, named. It's not easy to implement –
Appetite Not sure what the problem is; everything works as expected for me for passing the new ValueTuple<T>
with out, ref, and the new ref locals.
I'm using .NET 4.7 and have my C#7 compiler set to "latest" in the .csproj
settings "Advanced..." button.
Demonstration functions (and data):
static (int, int) g = (1, 2);
static void SetValues(int a, int b, ref (int, int) tt) => tt = (a, b);
static void SetValuesOut(int a, int b, out (int, int) tt) => tt = (a, b);
static ref (int, int) GetKnownTuple() => ref g;
static ref (int, int) SelectRef(
int ix,
ref (int, int) x,
ref (int, int) y,
ref (int, int) z)
{
if (ix == 0) return ref x;
if (ix == 1) return ref y;
return ref z;
}
Usage Examples:
static void demo_usages() {
/// use 'ref return' to initialize a new 'ref local' tuple 'aa'
ref (int, int) aa = ref GetKnownTuple();
/// or use the same function without 'ref' to create a local COPY 'bb'
var bb = GetKnownTuple();
/// use 'ref' parameter to modify values of local copy 'bb' ('aa/g' are not altered)
SetValues(3, 4, ref bb);
/// deconstruction of 'ref local' tuple; reads values from referent 'g' (1, 2)
(int x, int y) = aa;
/// 'ref local' reference to a local tuple copy
ref (int, int) dd = ref bb;
/// use 'out' parameter to construct a new (non-'ref') local tuple 'cc'
SetValuesOut(y, x, out (int, int) cc);
/// ...or use 'out' with 'ref local' to wholly replace existing referent ('g' here)
SetValuesOut(5, 6, out aa);
/// 'ref return' function can also be used as assignment l-value...
GetKnownTuple() = (7, 8);
/// ('aa/g' are altered; locals 'bb' and 'cc' remain unchanged)
/// ...or assign a referent via 'ref local' variable (changes 'g' again)
aa = (9, 10);
/// conditional assignment via 'ref return' (changes 'g' again)
SelectRef(0, ref aa, ref bb, ref cc) = (11, 12);
}
It should be clear that much more is possible, but all cannot be shown here since the OP's question does not get into too many specific further requirements.
© 2022 - 2024 — McMap. All rights reserved.
public (int a, int b) Data;
– RefreshmentTuple
overValueTuple
then. Use what the language provides for you first until you could determine that you could benefit from usingTuple
. Judging by what you have shown here, you don't know that. – Leucomaine