Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使列表项为只读_C#_Private_Readonly_Public - Fatal编程技术网

C# 使列表项为只读

C# 使列表项为只读,c#,private,readonly,public,C#,Private,Readonly,Public,可能重复: 我的课程是: public SomeClass{ public List<Status> log { get; private set; } public enum Status { waitingForConnection, connected, receivingFile, doneReceivingFile

可能重复:

我的课程是:

public SomeClass{

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

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

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

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

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


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

不要将属性设置为列表。只需实现一个没有setter的indexer属性

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; }
}
类日志{
私有只读列表状态;
公共日志(列表项)
{
状态=项目;
}
公共地位本[int i]
{
获取{返回状态[i];}
}
}
公共课
{
公共日志日志{get;private set;}
}

将日志列表设为私有并使用公共get()属性如何?

返回a。

一个选项是让
SomeClass
继承
IEnumerable

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

编辑
我又看了一遍,意识到您只需要添加一个属性getter:

IEnumerable<Status> StatusList
{
    foreach (Status item in log)
    {
        yield return item;
    }
}
IEnumerable状态列表
{
foreach(日志中的状态项)
{
收益回报项目;
}
}
用于此。另外,请记住readonly关键字并不能真正使集合成为只读的

private List<Status> m_Log = new List<Status>();

public ReadOnlyCollection<Status> Log {
    get {
        return m_Log.AsReadOnly();
    }
}
private List m_Log=new List();
公共只读收集日志{
得到{
返回m_Log.AsReadOnly();
}
}

查看此线程中的答案:我很喜欢,但它是NET4.5+。
ReadOnlyCollection
从2.0开始就存在了。这不会阻止消费者执行类似于
instance.Log[0].SomeProperty=10的操作,是吗?
private List<Status> m_Log = new List<Status>();

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