2013-05-02 11 views
7

Ho il seguente codice C#.CIL OpCode (Ldarg_0) viene utilizzato anche se non ci sono argomenti

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

public void Add(int a, int b) 
{ 
    //Do something 
} 

Produce il seguente 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 

Ora, quello che non capisco è la linea all'offset 0001:

ldarg.0

so cosa l'opcode è per, ma non capisco davvero perché venga usato in th è un metodo, poiché non ci sono argomenti, giusto?

Qualcuno sa perché? :)

risposta

19

Nei metodi di istanza è presente un argomento implicito con indice 0, che rappresenta l'istanza su cui viene richiamato il metodo. Può essere caricato sullo stack di valutazione IL utilizzando il codice operativo ldarg.0.

1

La riga all'offset 0001: carica l'argomento nell'indice 0 nello stack di valutazione.

Ancora in: http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldarg_0.aspx

L'argomento di indice 0 è la instance del class contenente metodi HelloWorld e Add, come questo (o autonoma in altri languajes)

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) 

... questa ultima riga è come chiamata: this.Add(2,2); in C#.

Problemi correlati