如何确保此私有只读数组实际上是私有和只读?

Cri*_*onX 1 c# readonly

我试图弄清楚我是如何成功更改"只读"数组的.下面的代码运行成功,但我很困惑为什么私有/只读数组的解除引用是合法的,如下所示:

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      MyClass myClass = new MyClass();
      myClass.Time[5] = 5; // Why is this legal? How can I make it illegal?
    }
  }

  public class MyClass
  {
    private readonly uint[] time;
    public IList<uint> Time
    {
      get { return time; }
    }

    public MyClass()
    {
      time = new uint[7];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

正如我在上面提到的那样,我认为Time [5]是非法的,因为公共IList Time没有setter.

如何更改MyClass以确保它合法myClass.Time[5]

注意:我已经澄清了这个问题的意图,我在一开始就不清楚其意图是制作这个ILLEGAL.而且我想了解为什么它的合法性一如既往.

Wal*_*shi 5

正如我在上面提到的那样,我认为Time [5]是非法的,因为公共IList Time没有setter.

缺少setter意味着您无法将NEW ARRAY分配给属性的支持字段,但这并不意味着您无法更改支持字段指向的CURRENT数组引用.

另外,如何在构造函数中创建一个只读且在此类之外不可更改的数组?

您可以根据MSDN在声明阶段或类的构造函数中实现只读字段.

至于如何解决这个问题,下面的MSDN文章讨论了这个确切的问题以及解决它的一些方法.我不确定您的要求是什么,但我建议您尝试使用ReadOnlyCollectionBase实现自定义集合,然后传递它或者您可以使用ReadOnlyCollection<T>.ReadOnlyCollectionBase的链接提供了一个实现示例.