防止更改String.Empty的值

时间:2012-03-25 13:43:24

标签: c# .net reflection

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

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

如果代码位于x = myClass.bar ?? string.Empty的某个位置,这会导致问题。

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

1 个答案:

答案 0 :(得分:6)

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

internal const string Empty = "";

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

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

由于它是String.Empty,因此无法更改该值,这很好,但与此同时,如果const 的值为永远不变(不太可能),你必须改变你的价值,然后重新编译引用该字段的所有

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

除此之外,如果readonly被更改,不仅会影响与该字段的比较,而且我想象一下BCL中的巨大的方法数量会不会正常工作;通过Reflector查看,它似乎在mscorlib(.NET 4.0)单独引用了几百次

references to String.Empty in mscorlib 4.0

所以说,你可以尝试并保证价值没有改变,但它实际上并不实际(它将是猫和 - 的永恒游戏从你的程序的角度来看,如果String.Empty的值发生了变化,那么世界将会结束,并且程序几乎会在变更之后很快就会死于可怕的死亡。