2009-09-24 11 views
5

Bueno digamos que tenemos el código C#:MSIL Pregunta (básico)

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 

ahora a la cuestión de mi entendimiento es que ldarg # pone los argumentos proporcionados a la método en la pila para que podamos trabajar con ellos? ¿Pero por qué llama ldarg.1 y ldarg.0 cuando el método solo toma un argumento?

Respuesta

11

Los métodos de instancia tienen un parámetro implícito (this) que se pasa como el primer argumento de cada método de instancia. La instrucción ldarg.0 está cargando this en la pila. La instrucción ldarg.1 es la carga del primer argumento real (explícito).

4

Un método de instancia tiene el primer parámetro implícito this cargado por ldarg.0.

+0

¿Puedes extender un poco más tu respuesta? ¿Seguro que el primero es este pero es el primer ldarg.1 o ldarg.0 en este caso? – Peter