我有一個具有泛型類型的私有變量的類。
在類中我已經聲明瞭一個Foo方法。
檢查IL後,我發現方法Push的目標實際上是方法調用set_Property2,而不是類的字段。
編譯器如何在兩者之間建立連接?有關字段參考的MSIL問題
public class A
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
public class ShortDemo
{
private Stack<A> _stack = new Stack<A>();
private void Foo()
{
_stack.Push(new A()
{
Property1 = 1,
Property2 = 2
});
}
}
而IL:
.method private hidebysig instance void Foo() cil managed
{
.maxstack 3
.locals init (
[0] class ConsoleApplication1.A g__initLocal0)
L_0000: nop
L_0001: ldarg.0
L_0002: ldfld class [System]System.Collections.Generic.Stack1 ConsoleApplication1.ShortDemo::_stack
L_0007: newobj instance void ConsoleApplication1.A::.ctor()
L_000c: stloc.0
L_000d: ldloc.0
L_000e: ldc.i4.1
L_000f: callvirt instance void ConsoleApplication1.A::set_Property1(int32)
L_0014: nop
L_0015: ldloc.0
L_0016: ldc.i4.2
L_0017: callvirt instance void ConsoleApplication1.A::set_Property2(int32)
L_001c: nop
L_001d: ldloc.0
L_001e: callvirt instance void [System]System.Collections.Generic.Stack1::Push(!0)
L_0023: nop
L_0024: ret
}
您的字段在L_0024加載,然後將方法的參數放在堆棧上,然後在L_0052處調用Push。問題是什麼? – kvb 2010-10-29 17:12:28
這裏有太多的事情要做,以便於分析。請提供一個簡短但完整的程序來證明這一點,儘可能使用簡短的方法。 – 2010-11-05 15:54:27
我注意到它僅在使用對象初始值設定項時發生。當我創建A的新實例並將其推入堆棧時,ldfld行將從L_0002中省略並插入L_001a,這對我來說很有意義。 – Sagi 2010-11-05 16:37:39