Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这些操作码是干什么用的?_C#_Reflector_Opcode - Fatal编程技术网

C# 这些操作码是干什么用的?

C# 这些操作码是干什么用的?,c#,reflector,opcode,C#,Reflector,Opcode,使用reflector,我获得以下输出: .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 ob

使用reflector,我获得以下输出:

.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 
}
为了

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

不知何故,浇铸的结果被存储为一个局部变量-然后有一个无条件跳转到下一行,在那里再次加载局部变量。为什么?


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

这看起来像是一个调试版本,留下额外的IL来帮助调试器。在发行版中再试一次,它应该看起来更干净,并进行了优化等

.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 
}

这是调试版本吗?它可能是为了调试器而存在的


我在其他地方也看到过类似的事情——但几乎总是无害的。不要忘记,大部分优化都是通过JIT完成的,JIT可以很容易地注意到这样的事情。唯一的缺点是,更多的IL提示JIT方法不应该内联。

是的,将结果存储在本地以进行调试构建是非常有意义的-感谢必须明确,这是在使用optimize-选项而不是debug+构建时发生的,尽管默认的调试构建设置了这两个选项。我希望Eric的博客早点出现-pFYI,我的博客文章将在11号发布。谢谢你提供的信息。。。我来看看下面的链接:我想知道,@Jon,如果你碰巧知道的话:这些额外的东西对调试有什么用处?我可能理解将返回值存储在局部变量中——它允许在返回之前检查并可能更改它,尽管这并不明显:为什么调试器能够处理局部变量,但不能处理堆栈上的值?我一点也不明白的是无操作和下一条指令的分支:这些指令有什么用处?@Tom:我相信无操作可以让调试器更容易地添加断点,但这只是一些模糊的“知识”——而这不是JIT编译的代码这一事实显然让事情变得更加模糊。恐怕我对这一切的了解不是很透彻。谢谢,乔恩。是的,我们到处都听到调试器需要添加断点,但我始终不明白为什么在
nop
上放置断点比在任何其他东西上都要容易。。。(现在剩下的是找到生命、宇宙和一切的终极问题的答案:当乔恩·斯基特不知道答案时,问谁……)
.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 
}