2013-05-02 10 views
7

次のC#コードがあります。CIL OpCode(Ldarg_0)は引数がなくても使用されます

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

私が何を知っていますそのオペコードが対象ですが、なぜそれがなぜ使用されているのかわかりません引数はないので、メソッドです、そうですか?

なぜ誰かが知っていますか? :)

答えて

19

インスタンスメソッドでは、メソッドが呼び出されるインスタンスを表す暗黙の引数がインデックス0です。それはldarg.0オペコードを使用してIL評価スタックにロードすることができます。

10

私はldarg.0がスタックにthisをロードしていると思います。この答えを参照してください MSIL Question (Basic)

1

オフセット0001の行:インデックス0の引数を評価スタックにロードします。

もっと見る:インデックス0の引数は(他の languajesまたは自己)このように、 方法HelloWorldAddが含まれるclassinstanceあるhttp://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldarg_0.aspx

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) 

...この最後の行は、C#のthis.Add(2,2);と同じです。

関連する問題