.NET中是否可以使用不可变数组?

Nei*_*ski 28 .net c# arrays immutability

有可能以某种方式将a标记System.Array为不可变.当置于public-get/private-set之后,它们无法添加,因为它需要重新分配和重新分配,但消费者仍然可以设置他们希望的任何下标:

public class Immy
{
    public string[] { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

我认为readonly关键字可能会成功,但没有这样的运气.

小智 29

框架设计指南建议返回数组的副本.这样,消费者就无法从阵列中更改项目.

// bad code
// could still do Path.InvalidPathChars[0] = 'A';
public sealed class Path {
   public static readonly char[] InvalidPathChars = 
      { '\"', '<', '>', '|' };
}
Run Code Online (Sandbox Code Playgroud)

这些更好:

public static ReadOnlyCollection<char> GetInvalidPathChars(){
   return Array.AsReadOnly(InvalidPathChars);
}

public static char[] GetInvalidPathChars(){
   return (char[])InvalidPathChars.Clone();
}
Run Code Online (Sandbox Code Playgroud)

这些例子直接来自书中.


小智 27

ReadOnlyCollection<T>可能就是你要找的东西.它没有Add()方法.

  • @HenryJackson最后,.NET中的所有数据都可以通过Reflection进行修改.如此有意义的不变性只是使可变性无法访问的问题.可变集合的只读包装器当然算作不可变的*if*然后丢弃对可变集合的引用,使得突变变得不可能. (3认同)
  • 这与不可变数组并不是一回事 - "ReadOnlyCollection"不允许任何修改,但它只包含一个常规的`List`,它仍然可以被创建者更改. (2认同)

Jar*_*ttV 13

请参阅基类库中现在可用的不可变集合(当前处于预览中).


sha*_*esh 9

您可以使用Array.AsReadOnly方法返回.