Есть ли способ встроить декомпозицию кортежа, чтобы избежать ненужного выделения?

ventiseis спросил: 03 февраля 2018 в 10:02 в: c#

У меня есть следующий пример struct:

struct Data {
    internal long a;
    internal long b;    internal void Deconstruct(out long aa, out long bb) {
        aa = a; bb = b;
    }
}

Что делать, если я хочу использовать только значения структуры, забыть о самой структуре?

Data Generate()
    => new Data() { a = 3, b = 5 };void Test() {
    (var a, var b) = Generate();
    Console.WriteLine(a);
    Console.WriteLine(b);
}

Вызов Generate создает структуру и немедленно разлагается в ее частях. Могу ли я каким-то образом встроить этот процесс и вообще избавиться от структуры?

Я скомпилировал (эту библиотеку классов) с VS 15.5.7 в режиме выпуска, показывая ilspy:

.method private hidebysig 
    instance void Test () cil managed 
{
    // Method begins at RVA 0x208c
    // Code size 33 (0x21)
    .maxstack 3
    .locals init (
        [0] int64,
        [1] valuetype StackOverflowDemo.Q1/Data,
        [2] int64,
        [3] int64
    )    IL_0000: ldarg.0
    IL_0001: call instance valuetype StackOverflowDemo.Q1/Data StackOverflowDemo.Q1::Generate()
    IL_0006: stloc.1
    IL_0007: ldloca.s 1
    IL_0009: ldloca.s 2
    IL_000b: ldloca.s 3
    IL_000d: call instance void StackOverflowDemo.Q1/Data::Deconstruct(int64&, int64&)
    IL_0012: ldloc.2
    IL_0013: ldloc.3
    IL_0014: stloc.0
    IL_0015: call void [System.Console]System.Console::WriteLine(int64)
    IL_001a: ldloc.0
    IL_001b: call void [System.Console]System.Console::WriteLine(int64)
    IL_0020: ret
} // end of method Q1::Test

0 ответов