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