【问题标题】:make List items readonly [duplicate]使列表项只读[重复]
【发布时间】:2011-11-04 16:49:31
【问题描述】:

可能重复:
List<T> readonly with a private set

我有一门课:

public SomeClass{

        public List<Status> log { get; private set; }

        public enum Status
        {
            waitingForConnection,
            connected,
            receivingFile,
            doneReceivingFile
        }

        // later I initialize log and populate it...
       ///

}

到目前为止,很容易看出我只能在课堂上设置一个新的日志列表。如何防止用户编辑列表中的项目。换句话说,我不希望用户能够执行以下操作:

SomeClass someClass = new SomeClass();
//....
someClass.log[3] = \\different value

如果我将列表日志设为私有,那么我将实现这一点,但我想让用户看到日志列表的内容但不能编辑项目。

我也不想将公共枚举状态设为私有,以便用户可以看到状态...

那么如何限制用户编辑列表中的项目?

【问题讨论】:

标签: c# private readonly public


【解决方案1】:

不要让您的财产List&lt;Status&gt;。只需实现一个没有设置器的索引器属性。

class Log {
  private readonly List<Status> statuses;
  public Log(List<Status> items)
  {
     statuses = items;
  }
  public Status this[int i]
  {
      get { return statuses[i]; }
  }
}

public SomeClass
{
   public Log log { get; private set; }
}

【讨论】:

  • 这不会阻止消费者做类似instance.Log[0].SomeProperty = 10的事情,是吗?
【解决方案2】:

如何将日志列表设为私有并拥有一个公共的 get() 属性?

【讨论】:

    【解决方案3】:

    改为返回List.AsReadOnly()

    【讨论】:

      【解决方案4】:

      您可以选择让SomeClass 继承IEnumerable&lt;T&gt;

      这将导致您履行合同并实施 GetEnumerator 方法。只需返回列表的枚举数。现在可以将其用作只读 IEnumerable 集合。

      编辑
      我又看了一遍,意识到你只需要添加一个属性获取器:

      IEnumerable<Status> StatusList
      {
          foreach (Status item in log)
          {
              yield return item;
          }
      }
      

      【讨论】:

        【解决方案5】:

        为此使用ReadOnlyCollection。另外请注意,readonly 关键字并不真正使集合成为只读。

        private List<Status> m_Log = new List<Status>();
        
        public ReadOnlyCollection<Status> Log {
            get {
                return m_Log.AsReadOnly();
            }
        }
        

        【讨论】:

        • 我会喜欢这个,但它是 NET4.5+。
        • ReadOnlyCollection&lt;T&gt; 自 2.0 以来一直存在。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2014-07-03
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多