2009-09-24 19 views
5

Beh diciamo che abbiamo questo codice C#:MSIL Domanda (di base)

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

IL:.

.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 

ora alla questione la mia comprensione è che ldarg # mette gli argomenti forniti al metodo in pila in modo che possiamo lavorare con loro? Ma perché chiama ldarg.1 e ldarg.0 quando il metodo accetta solo un argomento?

risposta

11

I metodi di istanza hanno un parametro implicito (this) passato come primo argomento di ogni metodo di istanza. L'istruzione ldarg.0 sta caricando this nello stack. L'istruzione ldarg.1 è il caricamento del primo argomento (esplicito) reale.

4

Un metodo di istanza ha il primo parametro implicito this caricato da ldarg.0.

+0

puoi estendere la tua risposta un po '? certo il primo è questo ma è il primo ldarg.1 o ldarg.0 in questo caso? – Peter