這看起來像一個反射器錯誤:它只是s_barrier
字段的正常易失性讀取。這裏沒有「特殊」的IL,這在C#中是不可表達的。
L_000d: volatile.
L_000f: ldsfld object modreq(System.Runtime.CompilerServices.IsVolatile) System.Threading.LazyInitializer::s_barrier
這僅僅是正常碼從靜態揮發性字段在讀取時的編譯器生成。
這裏的一個更簡單的REPRO:剛編譯以下(包裝在一個型)釋放模式:
private static volatile object field;
private static void Main()
{
var temp = field;
}
反射器產生以下反編譯C#:
private static void Main()
{
volatile object field = Program.field;
}
時IL實際上是:
L_0000: volatile.
L_0002: ldsfld object modreq([mscorlib]System.Runtime.CompilerServices.IsVolatile) WindowsFormsApplication1.Program::field
L_0007: pop
L_0008: ret
UPDATE: 下面是我對所發生的事情的猜測:在釋放模式,C#編譯器優化離開現場(揮發性讀取的結果)的值與局部變量(stloc
指令),因爲分配當地沒有被使用。這似乎混淆了反射器。如果您更改了使用隨後使用的本地方法,則確實會發射stloc
(或類似的)指令,之後來自Reflector的反編譯輸出看起來很明智。
來源
2012-01-02 15:22:15
Ani
同意。以某種方式特定於發佈版本。 – 2012-01-02 15:32:02
我遇到了同一行代碼。你能解釋爲什麼這樣實現嗎?因爲我不明白爲什麼需要這條線 – Mark 2016-08-19 15:59:21