c# - 有没有办法内联元组解构以避免不必要的分配?

标签 c# struct tuples inline c#-7.0

我有以下示例结构:

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的调用创建了一个结构体,并立即将其分解为各个部分。我可以以某种方式内联这个过程并完全摆脱结构吗?

我在 Release模式下使用 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

最佳答案

如果你想忘记结构,而不是

Data Generate()
    => new Data() { a = 3, b = 5 };

为什么不使用

void Generate(out long aa, out long bb)
{
    aa = 3; bb = 5;
}

这消除了您所要求的结构。

如果您想保留结构但摆脱额外的分配,您也可以这样做:

class Data {
    public long A { get; internal set; }
    public long B { get; internal set; }

    internal Data(long a, long b) {
        A = a; B = b;
    }
}

然后使用:

void Test() {
    var data = Generate();
    Console.WriteLine(data.A);
    Console.WriteLine(data.B);
}

关于c# - 有没有办法内联元组解构以避免不必要的分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49019751/

相关文章:

c# - 动态表达返回类型Lambda表达式

c# - 监听一系列 UDP 端口

Python 元组重组

python - 发送元组列表作为电子邮件正文和原始电子邮件消息

c# - 同一类的析构函数中的对象实例化和垃圾收集

c# - 用一组 8 个 boolean 值找到正确组合的最快方法

c - 如何在C中动态添加结构成员?

f# - 如何在 F# 中使用 BlockingCollection<'a>.TryTake

vector - 如何从 Rust 结构数组中获取字段值数组?

C:创建索引,我做错了什么?