【问题标题】:How do I declare a writable array of constant objects in C#?如何在 C# 中声明一个可写的常量对象数组?
【发布时间】:2011-05-10 01:49:14
【问题描述】:

我需要能够设置数组中的对象,但我不希望能够更改任何单个对象的状态。

【问题讨论】:

    标签: c# arrays oop object constants


    【解决方案1】:

    我会考虑使用某种形式的不可变集合作为更好的设计概念。

    选项包括返回为 IEnumerable、使用 yield[1] 的 IEnumerable、ReadOnlyCollection...请参阅下面的链接以获得更好的解释。

    [1]

    public IEnumerable<string> Hosts 
          { 
                get     
                 {     
                     foreach (var host in _hosts)
                     {    
                         yield return host;
                     }    
                 }
         }
    

    http://geekswithblogs.net/BlackRabbitCoder/archive/2010/11/04/c.net-fundamentals-returning-an-immutable-collection.aspx

    【讨论】:

      【解决方案2】:

      好吧,你可以声明一个私有变量,然后声明一个引用该变量的属性,只定义了 getter,这使它成为只读的。

      例子:

      private int[] myArray =new int[5];
      public int[] MyArray
      {
        get { return MyArray; }
      }
      

      【讨论】:

      • 我不相信这能解决 OP 试图达到的目标 - 例如具有StringBuilder[] 类型的数组,但防止每个StringBuilder 的内容发生变化。
      • @Jon: 嗯..再次阅读他的措辞,我想你是对的,但我想 OP 应该决定他试图达到什么目的,并否决我的答案而不是你..哈哈...
      • 我实际上已经撤消了我的反对意见,但很明显你的回答并没有解决 OP 的问题。
      • @Jon:我同意,我认为你的回答涵盖了他的要求。
      【解决方案3】:

      恐怕你不能。 C# 中没有与 C++ 中灵活的“const”等效的东西。

      如果它是你自己的类型,你可以尝试让它不可变(如string)开始。这对改变非常有效:)

      请注意,尽管您的问题要求一个可写数组,但实际上没有其他类型 - 您不能创建一个最初填充时只读的数组...您必须使用其他方法(例如创建一个 @ 987654322@ 包装另一个集合,为包装器所知)。我知道在您的特定情况下这不是问题,但我只是想指出这一点。如果您使变量引用数组readonly,那只会阻止其他代码将变量的值设置为对另一个数组的引用 - 它不会阻止数组本身的更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        相关资源
        最近更新 更多