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

ani*_*ine 8 c# clr il cil

我有以下C#代码.

public void HelloWorld()
{
    Add(2, 2);
}

public void Add(int a, int b)
{
    //Do something
}
Run Code Online (Sandbox Code Playgroud)

它产生以下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
Run Code Online (Sandbox Code Playgroud)

现在,我不明白的是偏移0001处的线:

ldarg.0

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

有人知道为什么吗?:)

Zak*_*ley 21

在实例方法中,有一个带有索引0的隐式参数,表示调用该方法的实例.它可以使用ldarg.0操作码加载到IL评估堆栈中.


Twi*_*tie 12

我认为ldarg.0正在加载this到堆栈上.看到这个答案 MSIL问题(基本)