我有以下C#代码。
public void HelloWorld()
{
Add(2, 2);
}
public void Add(int a, int b)
{
//Do something
}
它产生以下CIL
.method public hidebysig instance void HelloWorld() cil managed
{
// Code size 11 (0xb)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.2
IL_0003: ldc.i4.2
IL_0004: call instance void ConsoleApplication3.Program::Add(int32,
int32)
IL_0009: nop
IL_000a: ret
} // end of method Program::HelloWorld
现在,我不明白的是偏移0001处的线:
ldarg.0
我知道操作码的用途是什么,但我真的不明白为什么它在这个方法中使用,因为没有参数,对吧?
有人知道为什么吗? :)
答案 0 :(得分:21)
在实例方法中,有一个带有索引0的隐式参数,表示调用该方法的实例。它可以使用ldarg.0
操作码加载到IL评估堆栈。
答案 1 :(得分:12)
我认为ldarg.0
正在将this
加载到堆栈中。看到这个答案
MSIL Question (Basic)
答案 2 :(得分:1)
偏移0001处的行:将索引0处的参数加载到评估堆栈上。
请参阅:http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldarg_0.aspx
索引0处的参数是包含的
instance
的{{1}} 方法class
和HelloWorld
,就像这个(或其他的自我) languajes)
Add
...这最后一行是C#中的呼叫: IL_0001: ldarg.0 //Loads the argument at index 0 onto the evaluation stack.
IL_0002: ldc.i4.2 //Pushes a value 2 of type int32 onto the evaluation stack.
IL_0003: ldc.i4.2 //Pushes a value 2 of type int32 onto the evaluation stack.
IL_0004: call instance void ConsoleApplication3.Program::Add(int32, int32)
。