部分来自好奇的破坏事物的观点,部分来自对潜在问题的保护。想象一下,通过调用以下内容(或类似的东西,但string.Empty
是一个很好的例子)可能发生的最坏情况:
typeof(String).GetField("Empty",
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.GetField
).SetValue(null, "foo" );
如果代码位于x = myClass.bar ?? string.Empty
的某个位置,这会导致问题。
是否有任何方法(类似于不同的应用程序域或类似)来防止(或检测)更改值String.Empty
或SqlDateTime.MinValue
(或.NET中的其他类似只读字段)的人?
答案 0 :(得分:6)
您可以在 程序集中定义自己的const
字段,如下所示:
internal const string Empty = "";
然后对String.Empty
进行检查,但这几乎是徒劳的。
您必须在访问String.Empty
的任何地方执行检查并有效地替换它(因为您在比较时检查,实际使用中没有任何意义{\ n} {1}}超过你的版本。)
由于它是String.Empty
,因此无法更改该值,这很好,但与此同时,如果const
的值为} em>永远不变(不太可能),你必须改变你的价值,然后重新编译引用该字段的所有。
当然,你可以制作你的版本String.Empty
,但是你很容易通过反思改变价值,而你又回到你开始的地方。
除此之外,如果readonly
被更改,不仅会影响与该字段的比较,而且我想象一下BCL中的巨大的方法数量会不会正常工作;通过Reflector查看,它似乎在mscorlib(.NET 4.0)单独引用了几百次:
所以说,你可以尝试并保证价值没有改变,但它实际上并不实际(它将是猫和 - 的永恒游戏从你的程序的角度来看,如果String.Empty
的值发生了变化,那么世界将会结束,并且程序几乎会在变更之后很快就会死于可怕的死亡。