即使没有参数,也使用CIL OpCode(Ldarg_0)

时间:2013-05-02 19:26:33

标签: c# clr cil il

我有以下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

我知道操作码的用途是什么,但我真的不明白为什么它在这个方法中使用,因为没有参数,对吧?

有人知道为什么吗? :)

3 个答案:

答案 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}}   方法classHelloWorld,就像这个(或其他的自我)   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)