gpt4 book ai didi

c# - 在闭包中捕获变量时,添加大括号如何更改生成的 IL 代码?

转载 作者:太空宇宙 更新时间:2023-11-03 15:37:04 26 4
gpt4 key购买 nike

阅读 this question 的答案后,我不清楚一件事。用户 David Arno 指出,在以下情况下,编译器将为方法 X 生成更多 IL 代码,因为有额外的大括号。

public Func<int> X()
{
{
var i = 1;
{
i++;
{
return () => i;
}
}
}
}

public Func<int> Y()
{
var i = 1;
i++;
return () => i;
}

我看不出这两段代码之间的区别。在我看来,您可以安全地从 X 中删除所有大括号。哪对大括号负责额外的 IL 代码?我认为如果 XY 多一对大括号,代码片段会更清晰(我认为这足以证明这一点)。

最佳答案

我编译了代码并使用 ILDASM 检查了生成的 IL。事实证明,在这种情况下,两种方法生成的代码没有区别。

.method public hidebysig instance int32  '<X>b__0'() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init ([0] int32 CS$1$0000)
IL_0000: ldarg.0
IL_0001: ldfld int32 ConsoleApplication1.Test/'<>c__DisplayClass2'::i
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method '<>c__DisplayClass2'::'<X>b__0'


.method public hidebysig instance int32 '<Y>b__4'() cil managed
{
// Code size 11 (0xb)
.maxstack 1
.locals init ([0] int32 CS$1$0000)
IL_0000: ldarg.0
IL_0001: ldfld int32 ConsoleApplication1.Test/'<>c__DisplayClass5'::i
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method '<>c__DisplayClass5'::'<Y>b__4'

关于c# - 在闭包中捕获变量时,添加大括号如何更改生成的 IL 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com