今天早上被问到一个诡异的问题,我们定义了一个静态只读的字段,是一个数组。根据理解,我们原以为这个数组肯定是只读的,但事实上却发现它是可以修改的。如下面的例子
public sealed class Class1
{
public readonly int[] B = new int[] { 2, 2 };
}
然后在一个程序里面读写它
static void Main(string[] args)
{
Class1 c = new Class1();
c.B[1] = 3;
Console.Write(c.B[1]);
Console.Read();
}
编译没有问题,而且确实能修改。
请参考微软的这个文档 http://msdn.microsoft.com/zh-cn/library/ms172409(VS.80).aspx
一定不要使用托管库的公共只读数组字段来定义应用程序的边界行为或安全性,因为公共只读数组字段可以被修改。
备注
某些 .NET Framework 类中提供包含平台特定边界参数的只读公共字段。例如,InvalidPathChars 字段是一个数组,该数组描述文件路径字符串中不允许使用的字符。在整个 .NET Framework 中存在许多类似的字段。
可以通过您的代码或共享其应用程序域的代码来修改公共只读字段(如 InvalidPathChars)的值。不应使用这样的公共只读数组字段来定义应用程序的边界行为。否则,恶意代码可能会更改边界定义并以出乎意料的方式使用您的代码。
在 .NET Framework 2.0 版和更高版本中,应使用可返回新数组的方法,而不应使用公共数组字段。例如,您不应使用 InvalidPathChars 字段,而应使用GetInvalidPathChars 方法。
注意,.NET Framework 类型不使用公共字段在内部定义边界类型。.NET Framework 改用单独的私有字段。更改这些公共字段的值不会改变 .NET Framework 类型的行为。