我有以下示例结构
:
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/