使用反射器我得到以下输出:
.method private hidebysig static class myModelTestarea.Foo Method() cil managed
{
.maxstack 1
.locals init ([0] class myModelTestarea.Foo CS$1$0000)
L_0000: nop
L_0001: ldc.i4.0
L_0002: newarr object
L_0007: call object myModelTestarea.Program::Resolve(object[])
L_000c: castclass myModelTestarea.Foo
L_0011: stloc.0
L_0012: br.s L_0014
L_0014: ldloc.0
L_0015: ret
}
的
private static Foo Method()
{
return (Foo)Resolve();
}
private static object Resolve( params object[] args )
{
return new Foo();
}
第11-14行是做什么的?我调用一个函数并得到一个结果(第7行)。我将结果转换为正确的返回类型(第c行) - 为什么不立即返回?
不知何故,转换结果存储为局部变量 - 然后有一个无法跳转到下一行,再次加载局部变量。为什么呢?
在我看来,第11-14行和局部变量可以省略......?
答案 0 :(得分:13)
这看起来像一个DEBUG构建,留下额外的IL来帮助调试器。在RELEASE中再次尝试它,它应该看起来更干净,优化等。
.method private hidebysig static class program/Foo Method() cil managed
{
.maxstack 8
L_0000: ldc.i4.0
L_0001: newarr object
L_0006: call object program::Resolve(object[])
L_000b: castclass program/Foo
L_0010: ret
}
答案 1 :(得分:4)
这是一个调试版本吗?为了调试器,它可能就在那里。
我在其他地方也见过类似的东西 - 但它几乎总是无害的。不要忘记大多数优化都是由JIT完成的,它可以很容易地注意到这样的事情。唯一的缺点是更多IL提示JIT不应该内联该方法。