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();
}
}