c# – 无法使用反射更改只读字段
所以,我在摆弄和学习反思时遇到了一个奇怪的问题.
我正在尝试更改私有的readonly字段,如下所示: public class A { private static readonly int x; public int X { get { return x; } } } static void Main(string[] args) { A obj = new A(); Type objType = typeof(A); Console.WriteLine(obj.X); FieldInfo objField = objType.GetField("x",BindingFlags.Static | BindingFlags.NonPublic); objField.SetValue(null,100); Console.WriteLine(obj.X); Console.ReadLine(); } 如果我按原样运行程序,那么每次都会打印0到控制台. 谁可以了解这里发生的事情?谢谢! 编辑:扼杀它似乎在Visual Studio 2012中工作,但不是在2010年.据我所知,两者的设置是相同的. 编辑2:使用平台目标x64构建时工作,而不是使用x86.猜猜新问题是:为什么? 编辑3:在反汇编中比较x64和x86版本;在x86版本中似乎有一些内联. 编辑4:哦,我想我已经弄清楚发生了什么,有点像.我不认为A类中的属性是内联的问题.我相信当在main方法中第二次读取属性时,属性调用被优化掉(后备字段应该只读,值应该相同)并且旧值被重用.这至少是我的“理论”. 解决方法
JIT正在勾勒出吸气剂:
使用getter上的 public class A { private static int x; public int X { [MethodImpl(MethodImplOptions.NoInlining)] get { return x; } } } 现在输出将是: 0 100 见:Does C# inline properties? 一个简单的解决方法是使用可以为null的整数(int?)值类型. public class A { private static readonly int? x; public int X { get { return x ?? 0; } } } x将不会被内联,因为CLR需要检查x的值是否是对int的有效转换. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |