其他分享
首页 > 其他分享> > 为什么在通过反射更改静态只读字段后,该只读字段的输出过旧?

为什么在通过反射更改静态只读字段后,该只读字段的输出过旧?

作者:互联网

为什么“ someValue”变量是只读的(但我们仍然可以通过反射更改其值)输出为“ 10”,尽管实际上它确实更改为55?

static class Program
{
    static readonly int someValue = 10;

    static void Main(string[] args)
    {
        Console.WriteLine(someValue); // 10

        typeof(Program)
             .GetField("someValue", BindingFlags.Static | BindingFlags.NonPublic)
             .SetValue(null, 55); // change readonly field via reflection to 55

        Console.WriteLine(someValue); // output in console 10, 
                                      // but in visual studio debugger it shows 55

        Console.ReadKey();
    }
}

解决方法:

可能只是JIT优化,以防止多次读取变量.

您正在更改已声明为只读的内存位置,因此,如果读者缓存这些值,不要感到惊讶.

标签:system-reflection,jit,inlining,c,net
来源: https://codeday.me/bug/20191211/2106685.html