当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《.NET中是否可以使用不可变数组?》经验,为你挑选了4个好方法。

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

public class Immy
{
    public string[] { get; private set; }
}

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



1> 小智..:

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

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

这些更好:

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

public static char[] GetInvalidPathChars(){
   return (char[])InvalidPathChars.Clone();
}

这些例子直接来自书中.



2> 小智..:

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


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

3> JarrettV..:

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



4> shahkalpesh..:

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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有