这看起来像一个反射器错误:它只是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