2

我现在正在使用 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它并且没有它会起作用吗?

4

1 回答 1

7

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

如果您在发布/优化模式下编译相同的代码,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 
}
于 2012-10-12T09:35:25.223 回答