【发布时间】:2025-12-06 23:25:01
【问题描述】:
我有以下例子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 *Demo.Q1/Data,
[2] int64,
[3] int64
)
IL_0000: ldarg.0
IL_0001: call instance valuetype *Demo.Q1/Data *Demo.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 *Demo.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
【问题讨论】:
-
好吧,你为什么不首先使用
ValueTuple?为什么要定义struct? -
为什么要内联呢? JIT 编译器处理内联决策,因为它具有与内联是否是有效优化最相关的信息。您真的应该查看 JIT 的机器代码。
-
@mikez 这很重要。我想:内联它并优化分配 - 这可能是不可能的。
-
还有哪个分配会被删除?结构体不会给 GC 增加内存压力,因此与类相比,结构体的开销较低。
-
@CamiloTerevinto 我试过了,确实有区别。使用
ValueTuple,值直接从评估堆栈中获取,不需要ValueTuple的局部变量。
标签: c# struct tuples inline c#-7.0