6

次の C# コードがあるとしましょう。

public override void Write(XDRDestination destination)
{
    destination.WriteInt(intValue);
    destination.WriteBool(boolValue);
    destination.WriteFixedString(str1, 100);
    destination.WriteVariableString(str2, 100);
}

イル:

.method public hidebysig virtual instance void 
        Write(class [XDRFramework]XDRFramework.XDRDestination destination) cil managed
{
  // Code size       53 (0x35)
  .maxstack  8
  IL_0000:  ldarg.1
  IL_0001:  ldarg.0
  IL_0002:  call       instance int32 LearnIL.Test1::get_intValue()
  IL_0007:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteInt(int32)
  IL_000c:  ldarg.1
  IL_000d:  ldarg.0
  IL_000e:  call       instance bool LearnIL.Test1::get_boolValue()
  IL_0013:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteBool(bool)
  IL_0018:  ldarg.1
  IL_0019:  ldarg.0
  IL_001a:  call       instance string LearnIL.Test1::get_str1()
  IL_001f:  ldc.i4.s   100
  IL_0021:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteFixedString(string,
                                                                                                 uint32)
  IL_0026:  ldarg.1
  IL_0027:  ldarg.0
  IL_0028:  call       instance string LearnIL.Test1::get_str2()
  IL_002d:  ldc.i4.s   100
  IL_002f:  callvirt   instance void [XDRFramework]XDRFramework.XDRDestination::WriteVariableString(string,
                                                                                                    uint32)
  IL_0034:  ret
} // end of method Test1::Write

さて、私の理解では、ldarg.# はメソッドに提供された引数をスタックに置くので、それらを操作できますか? しかし、メソッドが 1 つの引数しかとらないのに、なぜ ldarg.1 と ldarg.0 を呼び出すのでしょうか?

4

2 に答える 2

13

thisインスタンス メソッドには、すべてのインスタンス メソッドの最初の引数として渡される暗黙的なパラメーター ( ) があります。命令がスタックにldarg.0ロードされています。this命令ldarg.1は、最初の実際の (明示的な) 引数をロードすることです。

于 2009-09-24T18:29:39.980 に答える
4

インスタンス メソッドには、thisによってロードされる最初の暗黙的なパラメータがありますldarg.0

于 2009-09-24T18:28:36.567 に答える