.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 9 (0x9)
.maxstack 1
.locals init ([0] class ConstReadOnly.second p)
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: newobj instance void ConstReadOnly.second::.ctor(int32)
IL_0007: stloc.0
IL_0008: ret
} // end of method Program::Main
此处IL_0002
后跟IL_0007
任何人都可以告诉我这里发生的实际情况吗?
答案 0 :(得分:3)
这只是标签。中间没有代码。标签表示从函数开头的偏移量(以字节为单位)。
offset_0: nop //size 1 byte
offset_1: ldc.i4.5 // size 1 byte
offset_2: newobj instance void ConstReadOnly.second::.ctor(int32) // size 5 bytes
offset_7: stloc.0 // size 1 byte
offset_8: ret
您可以轻松更改它们并重新编译。
答案 1 :(得分:1)
当我在指定ildasm
选项时对代码运行/BYTES
时,输出为:
.method private hidebysig static void Main(string[] args) cil managed
// SIG: 00 01 01 1D 0E
{
.entrypoint
// Method begins at RVA 0x2048
// Code size 9 (0x9)
.maxstack 1
.locals init (class ConstReadOnly.second V_0)
IL_0000: /* 00 | */ nop
IL_0001: /* 1B | */ ldc.i4.5
IL_0002: /* 73 | (06)000003 */ newobj instance void ConstReadOnly.second::.ctor(int32)
IL_0007: /* 0A | */ stloc.0
IL_0008: /* 2A | */ ret
} // end of method Program::Main
在这里,您可以看到用于在磁盘上将代码表示为注释的实际字节数。请注意,所有指令只使用一个字节,newobj
指令除外,它是5个字节,与行标签中使用的数字完全对应。
那些标签在那里,任何跳转指令都可以显示它们跳转的位置。它们与您在C#中编写的代码行没有任何关系。