假設我有以下代碼:在IL代碼中,爲什麼在給定的情況下沒有nop操作碼?爲什麼在給定的情況下有br.s操作碼?
public class Class1
{
private Class2 obj;
public void MethodA()
{
var class2 = new Class2();
class2.PropertyI = 2;
obj = MethodB(class2);
}
public Class2 MethodB(Class2 class2)
{
return class2;
}
}
public class Class2
{
public int PropertyI { get; set; }
}
從Visual Studio 2010中的.NET 2.0組件編譯生成的IL代碼如下:
.method public hidebysig instance void MethodA() cil managed
{
.maxstack 3
.locals init (
[0] class ClassLibrary1.Class2 class2)
L_0000: nop
L_0001: newobj instance void ClassLibrary1.Class2::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: ldc.i4.2
L_0009: callvirt instance void ClassLibrary1.Class2::set_PropertyI(int32)
L_000e: nop
L_000f: ldarg.0
L_0010: ldarg.0
L_0011: ldloc.0
L_0012: call instance class ClassLibrary1.Class2 ClassLibrary1.Class1::MethodB(class ClassLibrary1.Class2)
L_0017: stfld class ClassLibrary1.Class2 ClassLibrary1.Class1::obj
L_001c: ret
}
.method public hidebysig instance class ClassLibrary1.Class2 MethodB(class ClassLibrary1.Class2 class2) cil managed
{
.maxstack 1
.locals init (
[0] class ClassLibrary1.Class2 CS$1$0000)
L_0000: nop
L_0001: ldarg.1
L_0002: stloc.0
L_0003: br.s L_0005
L_0005: ldloc.0
L_0006: ret
}
我的問題有以下幾種:
- 在治法,爲什麼會出現不
L_0006
和L_0007
之間的nop
代碼?- 由於
L_0001
到L_0006
從L_0007
到L_0009
不同,爲什麼沒有nop
操作碼?
- 由於
- 在MethodB中,爲什麼需要
L_0003
?
你在編譯版本嗎?因爲我聽說在方法頭文件中,調試編譯有NOP代碼。 – 2013-03-22 22:30:07
我正在編譯Debug。 – cm007 2013-03-22 22:30:40