防止更改String.Empty的值

Sep*_*eph 9 .net c# reflection

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

typeof(String).GetField("Empty", 
    BindingFlags.Public | 
    BindingFlags.NonPublic | 
    BindingFlags.Static | 
    BindingFlags.GetField
).SetValue(null, "foo" );
Run Code Online (Sandbox Code Playgroud)

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

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

cas*_*One 7

你可以定义自己const在领域组装,如下所示:

internal const string Empty = "";
Run Code Online (Sandbox Code Playgroud)

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

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

由于它是const,该值不能改变,这是很好的,但在同一时间,如果该值String.Empty 不断发生变化(但不太可能),你就必须做出改变,以你的价值,然后重新编译一切是引用该字段.

当然,你可以制作你的版本readonly,但是你很容易通过反射改变价值,而你又回到了你开始的地方.

添加到这一事实,如果String.Empty改变的话,不仅对现场比较的影响,但我会想象一个巨大的BCL中的方法将只是无法正常工作数; 通过反射看,似乎它引用几百次的mscorlib(.NET 4.0)独自:

mscorlib 4.0中对String.Empty的引用

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