【问题标题】:update Readonly int array?更新只读 int 数组?
【发布时间】:2013-06-19 08:54:13
【问题描述】:

在经典意义上,只读对象只能在构造函数中设置,以后不能修改。为什么 readonly int 数组的行为有任何不同。

PS:我知道Readonly 收藏,我只是想知道为什么允许这样做?

class Class1
{
    public readonly int[] a;

    public Class1()
    {
        a = new int[3];
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
    }

    public void Update()
    {
        a[0] = 10;
    }
}

【问题讨论】:

  • 怎么样? int 数组不是immutable,只是readonly,这意味着它只能被分配一次(除了反射之类的魔术)。另一方面,它的内容可以改变......

标签: c# .net readonly readonly-collection


【解决方案1】:

Readonly 修饰符应用于它分配给的实际类型。所以在这种情况下,它分配给一个 Array 类型的实例,而不是分配给其中存在的元素

这就是为什么,是的,你仍然可以改变元素的值,但是像

这样的代码
public void Update()
{
   a[0] = new int[3];
}

将失败,因为您要更改 Array 类型实例(而不是其内容)

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    readonly 使数组不可变,而不是数组项。 readonly 表示您可以将数组分配给内联或仅在构造函数中的 a 字段。但这并不妨碍任何人更改每个数组项的内容。

    【讨论】:

      【解决方案3】:

      如果您将此数组内容设为只读,请这样做

      public readonly int[] a;
      ReadOnlyCollection<int> result = Array.AsReadOnly(a);
      public Class1()
      {
          a = new int[3];
          a[0] = 1;
          a[1] = 2;
          a[2] = 3;
      
      }
      
      public void Update()
      {
          result[0] = 10; // Compile Time Error Here
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2018-07-17
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多