Tol*_*rak 10 c# reflection readonly
虽然只是玩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
}
}
Run Code Online (Sandbox Code Playgroud)
为什么反思让我们改变只读字段?
问题是"为什么允许通过反射设置",而不是"如何做",所以它不是重复我可以使用反射更改C#中的私有只读字段吗?.
cor*_*iKa 16
以同样的方式,化学定律说没有反应可以导致一个元素的原子变成另一个元素的原子,但是物理定律说它一直在发生.化学是物理学的有限子集,以便将问题简化为更可解决的方式.
反射是这种情况下的物理学,正常的编程就是化学.它以更简单的心态运作.反射允许您规避更简单的规则集,使您接触新流程,但也会遇到新的危险.
因为readonly
,像,一样private
,要防范Murphy,而不是Machiavelli *。
我们使用readonly
和private
以及其他任何限制我们可以做的事情,主要是因为我们希望限制的是比我们有用的和富有成果的东西更多的不正确,不一致或只是普通的愚蠢的东西。
但这仍然只是一和零。如果将某些内存设置为数字“ 42”,并且我们通过一个只读字段进行访问,则在创建对象时它不是只读的。除了编译器发现“嘿,首先,您说您不想更改它,现在您正试图对其进行更改,这给出了什么?这两个决定之一肯定是错误的”之外,没有什么阻止更改它的。
现在,我们不能保证反射能够改变它,但是不能保证它不能改变。现在,反射的工作方式和只读的工作方式意味着您可以对其进行更改。至少要花费很多工作(也许成本会影响我们的用户以及需要实施该工作的团队)才能阻止某个可能因为这样做而费心的人。一个很好的理由。
请注意,与反射相关的权限会停止Machiavelli,
*严格来说,墨菲(Murphy)恰恰在谈论我们应该如何设计东西,以防止人们意外地做一些灾难性的事- readonly
是一个很好的例子,不能以错误的方式将插头插入更好的周围-马基雅维利在教导而不是练习技术。简而言之,这简直是无稽之谈。