2009-09-24 13 views
5

Nun sagen können wir diese C# -Code haben:MSIL Frage (Basic)

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 

Nun zur Frage mein Verständnis ist, dass ldarg # setzt die Argumente der gelieferten Methode auf dem Stapel, damit wir mit ihnen arbeiten können? Aber warum ruft es ldarg.1 und ldarg.0 auf, wenn die Methode nur ein Argument benötigt?

Antwort

11

Instanzmethoden haben einen impliziten Parameter (this), der als erstes Argument jeder Instanzmethode übergeben wird. Die Anweisung ldarg.0 lädt this auf den Stapel. Die Anweisung ldarg.1 lädt das erste echte (explizite) Argument.

4

Eine Instanzmethode hat den ersten impliziten Parameter this geladen von ldarg.0.

+0

Können Sie Ihre Antwort ein wenig erweitern? sicher, das erste ist das aber ist das erste ldarg.1 oder ldarg.0 in diesem Fall? – Peter