2009-09-24 98 views
5

好让说,我们有这样的C#代码:MSIL问题(基本)

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 

现在的问题我的理解是,ldarg#使供给的参数方法在堆栈上,所以我们可以与他们合作? 但是为什么当方法只需要一个参数时,它会调用ldarg.1和ldarg.0?

回答

11

实例方法具有作为每个实例方法的第一个参数传递的隐式参数(this)。指令ldarg.0正在将this加载到堆栈上。指令ldarg.1是加载第一个真实(显式)参数。

4

实例方法具有由ldarg.0加载的第一个隐式参数this

+0

你能否扩展你的答案?确定第一个是这个,但在这种情况下是第一个ldarg.1或ldarg.0? – Peter 2009-09-24 18:30:19