C# MSIL代码的研究

C# MSIL代码的研究,c#,.net,cil,C#,.net,Cil,我现在正在使用IL代码,将来需要自己编写。由于误解,我有些担心。下面是C语言中的一个简单方法# 这是它的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_00

我现在正在使用IL代码,将来需要自己编写。由于误解,我有些担心。下面是C语言中的一个简单方法#

这是它的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
,如果没有它,它会工作吗?

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

如果您在发布/优化模式下编译相同的代码,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 
}

“我自己写”,你要写IL吗?我已经在peer的回复上发布了IL应该是什么样的编辑我在发布版本中编辑了它-希望你不介意。你涵盖了关键点,所以第二个答案似乎是多余的。马克,谢谢你,现在更清楚了。然而,为什么.maxstack等于8?还有一件事:我不必使用L_00XX:指令,是吗?
.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 
}