设置只读字段(这个错误吗?)

只是玩c#,实现了一件奇怪的事情。

这是代码:

class Program { static void Main(string[] args) { System.Diagnostics.Debug.Write(string.Empty); typeof(string) .GetField("Empty", BindingFlags.Static | BindingFlags.Public) .SetValue(null, "Tolgahan"); Console.WriteLine(string.Empty); // output : Tolgahan } } 

为什么反思让我们改变只读字段?


问题是“为什么允许通过reflection设置”,而不是“如何做”,所以它不是重复我可以使用reflection更改C#中的私有只读字段吗? 。

同样,化学定律说没有反应可以导致一个元素的primefaces变成另一个元素的primefaces,但是物理定律说它一直在发生。 化学是物理学的有限​​子集,以便将问题简化为更可解决的方式。

reflection是这种情况下的物理学,正常的编程就是化学。 它以更简单的心态运作。 reflection允许您规避更简单的规则集,使您接触新流程,但也会遇到新的危险。

因为readonly ,像private一样,防范墨菲,而不是马基雅维利*。

我们使用readonlyprivate以及限制我们可以做什么的任何其他事情,主要是因为我们希望限制更多不正确,不一致或者只是简单的愚蠢的事情,而不是我们有用和富有成效的事情。

但它仍然只是零和零。 如果某个内存设置为数字“42”并且我们通过只读字段访问它,则在创建对象时它不是只读的。 没有什么可以阻止它被改变,除了编译器发现“嘿,首先你说你不想改变它,现在你试图改变它,是什么给出了?这两个决定中的一个肯定是错的”。

现在,没有承诺反思能够改变它,但没有承诺它不会。 现在,reflection的工作方式和readonly的工作方式意味着你可以改变它。 至少,需要花费大量工作(可能需要影响我们的用户以及需要实施该工作的团队的成本)才能阻止那些因为他们认为有这样做而烦恼的人一个很好的理由。

请注意,与reflection相关的权限会停止Machiavelli,

*严格地说,墨菲正在谈论我们应该如何设计东西以阻止人们意外地做一些灾难性的事情 – readonly是一个很好的例子,插头无法以错误的方式插入更好的方式 – 而且Machiavelli在教学而不是练习技术。 尽管如此,这简直就是一个简洁的说法。

它的可能性是因为.Net中的reflection是以这种方式实现的。 我只能猜测它的动机,但它是一个function强大(但速度慢)的工具,具有很大的灵活性和误用的可能性。

这不是实现这种改变的唯一方式,但这种讨论不像任何进一步的主观推测那样偏离主题和不合适。