How to create named reference types of tuples?

The following line creates a name ValueTuple:

var tuple = (a:1, b:2, c:3, d:4, e:5, f:6);  

Value types cannot be transferred efficiently. Does it offer a C#7way to create named type tuples Tuple?

+4
source share
2 answers

If you mean, if there is a way to bind other names to instance properties System.Tuple<...>, they are not.

Depending on why you want it, you can work around this by converting instances System.Tuple<...>to instances System.ValueTuple<...>using overloads ToValueTuplein TupleExtensions and vice versa with overloads ToTuple.

, , Deconstruct var (v1, .., vn) = tuple deconstruction.

+4

, ; , , ValueTuple<T> out, ref locals.

.NET 4.7, # 7 "" .csproj "...".

:

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;
}

:

/// 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);

, , , .

0

Source: https://habr.com/ru/post/1679000/


All Articles