部分是出于好奇的破坏事物的角度,部分是出于防范潜在问题的目的。想象一下通过调用以下内容(或类似的内容,但是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 中其他类似的只读字段)?
你可以定义你自己的const
领域在your像这样组装:
internal const string Empty = "";
然后执行检查String.Empty http://msdn.microsoft.com/en-us/library/system.string.empty.aspx,但这几乎是徒劳的。
您必须在访问的所有地方执行检查String.Empty
并有效地替换它(因为您会在比较时进行检查,所以实际使用没有意义String.Empty
不再超过你的版本)。
既然是const
,该值无法更改,这很好,但同时,如果String.Empty
does一旦发生变化(无论可能性如何),您都必须更改您的值,然后重新编译一切引用该字段。
当然,你可以制作你的版本readonly
,但是这样你就很容易通过反射改变值,然后你又回到了开始的地方。
除此之外,如果String.Empty
改变了,不仅会影响与该领域的比较,而且我想巨大的BCL 中的许多方法无法正常工作;通过Reflector查看,它似乎在mscorlib(.NET 4.0)中被引用了几百次alone:
这么说来,你可以尝试并保证该值没有改变,但这并不实用(这将是一场永恒的猫捉老鼠的游戏),从你的程序的角度来看,如果String.Empty
一旦被改变,世界就会终结,程序几乎一旦被改变就会很快可怕地死去。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)