2009-09-24 12 views
5

खैर कहते हैं कि हम इस ग # कोड प्राप्त हो जाता है:MSIL प्रश्न (बेसिक)

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

आईएल:।

.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 

अब सवाल का मैं समझता हूँ कि ldarg है # तर्कों को आपूर्ति डालता है ढेर पर विधि ताकि हम उनके साथ काम कर सकें? लेकिन यह विधि ldarg.1 और ldarg.0 क्यों कॉल करता है जब विधि केवल एक तर्क लेती है?

उत्तर

11

इंस्टेंस विधियों का एक निहित पैरामीटर (this) है जो प्रत्येक इंस्टेंस विधि के पहले तर्क के रूप में पारित किया जाता है। निर्देश ldarg.0 स्टैक पर this लोड हो रहा है। निर्देश ldarg.1 पहला वास्तविक (स्पष्ट) तर्क लोड कर रहा है।

4

एक उदाहरण विधि पहले अंतर्निहित पैरामीटर thisldarg.0 द्वारा लोड है।

+0

क्या आप अपना उत्तर थोड़ा बढ़ा सकते हैं? यकीन है कि पहला यह है लेकिन इस मामले में पहला ldarg.1 या ldarg.0 है? – Peter

संबंधित मुद्दे