防止更改String.Empty的值

部分来自好奇的破坏事物的观点,部分来自对潜在问题的保护。 想象一下,通过调用以下内容可以发生的最坏情况(或者类似的东西,但是string.Empty就是一个很好的例子):

 typeof(String).GetField("Empty", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField ).SetValue(null, "foo" ); 

当某些代码执行x = myClass.bar ?? string.Empty时,这会导致问题x = myClass.bar ?? string.Empty x = myClass.bar ?? string.Empty

是否有任何方法(类似于不同的应用程序域或类似)来防止(或检测)某些人更改String.EmptySqlDateTime.MinValue (或.NET中的其他类似只读字段)等值?

您可以在程序集中定义自己的const字段,如下所示:

 internal const string Empty = ""; 

然后对String.Empty执行检查,但这几乎是徒劳的。

您必须在访问String.Empty任何地方执行检查并有效地替换它(因为您在比较时检查,实际上对您的版本使用String.Empty没有任何意义)。

由于它是const ,因此无法更改值,这很好,但与此同时,如果String.Empty的值确实发生变化(不太可能),则必须对值进行更改,并且然后重新编译引用该字段的所有内容

当然,你可以只readonly你的版本,但是你很容易通过reflection改变价值,而你就会回到你开始的地方。

String.Empty ,如果改变String.Empty ,不仅会影响对该字段的比较,而且我认为BCL中的大量方法将无法正常工作; 通过Reflector查看,它似乎仅在mscorlib(.NET 4.0)中引用了几百次:

mscorlib 4.0中对String.Empty的引用

所以说,你可以尝试保证价值没有改变,但它只是不切实际(它将是一个永恒的猫捉老鼠游戏),从你的程序的角度来看,机会是String.Empty的价值发生了变化,世界将会结束,并且该程序几乎会在变更后很快就会死于可怕的死亡。