我现在正在使用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
并在没有它的情况下工作?
答案 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
}