这些操作码是什么?

tan*_*ius 6 c# reflector opcode

使用反射器我得到以下输出:

.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 
}
Run Code Online (Sandbox Code Playgroud)

对于

private static Foo Method()
{
  return (Foo)Resolve();
}

private static object Resolve( params object[] args )
{
  return new Foo();
}
Run Code Online (Sandbox Code Playgroud)

第11-14行是做什么的?我调用一个函数并得到一个结果(第7行).我将结果转换为正确的返回类型(第c行) - 为什么不立即返回?

不知何故,铸造的结果存储为局部变量 - 然后有一个无法跳转到下一行,再次加载局部变量.为什么?

在我看来,第11-14行和局部变量可以省略......?

Mar*_*ell 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 
}
Run Code Online (Sandbox Code Playgroud)