调查MSIL代码

时间:2012-10-12 09:32:42

标签: c# .net cil

我现在正在使用IL代码,将来需要自己编写代码。由于误解,我有一些担忧。这是C#

中的一个简单方法
public static string Method1(int id)
 {
   return Method2(id);
 }

这是它的IL代码

.method public hidebysig static string 
          Method1(int32 id) cil managed
  {
    // 
    .maxstack  1
    .locals init ([0] string CS$1$0000)
    IL_0000:  nop          // Why?
    IL_0001:  ldarg.0
    IL_0002:  call       string MyNamespace.MyClass::Method2(int32)
    IL_0007:  stloc.0    // storing a return value of MyClass::Method2 to local variable.
    IL_0008:  br.s       IL_000a   // Why?

    IL_000a:  ldloc.0    // Does it really require and why?
    IL_000b:  ret
  } // end of method MyClass::Method1

由于某种原因,CIL中的每个方法都有nop个操作。它为什么有它? 就我而言,是否有必要使用br.s IL_000a并在没有它的情况下工作?

1 个答案:

答案 0 :(得分:7)

nops允许你调试(设置断点),如果你在发布模式下编译,你会在代码中看到更少的nopes。

如果在发布/优化模式下编译相同的代码,IL应该看起来更加健全:

.method public hidebysig static string Method1(int32 id) cil managed
{
    .maxstack 8
    L_0000: ldarg.0 
    L_0001: call string MyNamespace.MyClass::Method2(int32)
    L_0006: ret 
}