列出<T>与一个私人设置只读

我该如何公开一个List<T>以便它是只读的,但可以私下设置?

这不起作用:

 public List<string> myList {readonly get; private set; } 

即使你这样做:

 public List<string> myList {get; private set; } 

你仍然可以这样做:

 myList.Add("TEST"); //This should not be allowed 

我想你可以有:

 public List<string> myList {get{ return otherList;}} private List<string> otherList {get;set;} 

我认为你是混合的概念。

 public List<string> myList {get; private set;} 

已经 “只读”了。 也就是说,在这个类之外,没有什么可以将myList设置为List<string>的另一个实例

但是,如果你想要一个只读列表,如“我不希望人们能够修改列表内容 ”,那么你需要公开一个ReadOnlyCollection<string> 。 你可以通过以下方式来完成

 private List<string> actualList = new List<string>(); public ReadOnlyCollection<string> myList { get{ return actualList.AsReadOnly();} } 

请注意,在第一个代码片段中,其他人可以操作列表,但不能更改您拥有的列表。 在第二个片段中,其他人将获得他们无法修改的只读列表。

如果你想只读集合使用ReadOnlyCollection<T> ,而不是List<T>

 public ReadOnlyCollection<string> MyList { get; private set; } 

我更喜欢使用IEnumerable

 private readonly List<string> _list = new List<string>(); public IEnumerable<string> Values // Adding is not allowed - only iteration { get { return _list; } } 

返回实现IList <>的ReadOnlyCollection

 private List<string> myList; public IList<string> MyList { get{return myList.AsReadOnly();} } 

有一个名为ReadOnlyCollection<T>的集合 – 是你在找什么?

您可以使用List的AsReadOnly()方法返回一个只读封装。

 private List<string> my_list; public ReadOnlyCollection<string> myList { get { return my_list.AsReadOnly(); } private set { my_list = value; } } 
  private List<string> _items = new List<string>(); public ReadOnlyCollection<string> Items { get { return _items.AsReadOnly(); } private set { _items = value } } 

这是一种方法

 public class MyClass { private List<string> _myList; public ReadOnlyCollection<string> PublicReadOnlyList { get { return _myList.AsReadOnly(); } } public MyClass() { _myList = new List<string>(); _myList.Add("tesT"); _myList.Add("tesT1"); _myList.Add("tesT2"); //(_myList.AsReadOnly() as List<string>).Add("test 5"); } } 
 private List<string> myList; public string this[int i] { get { return myList[i]; } set { myList[i] = value; } } 

在.NET 4.5框架中,您只能公开IReadOnlyList接口。 就像是:

 private List<string> _mylist; public IReadOnlyList<string> myList { get {return _myList;} } 

或者如果你想防止不必要的投射到IList

 private List<string> _mylist; public IReadOnlyList<string> myList { get {return new List<string>(_myList);} } 

你为什么使用一个列表。 听起来像你真正想要暴露的是IEnumerable

 public IEnumerable<string> myList { get; private set; } 

现在,该类的用户可以读取这些项目,但不能查询列表。

您也可以创build您的普通列表,但通过IEnumerabletypes的属性公开它

 private List<int> _list = new List<int>(); public IEnumerable<int> publicCollection{ get { return _list; } } 

有点晚,但不过:我不喜欢使用ReadOnlyCollection包装,因为它仍然暴露了修改集合的所有方法,当它们在运行时被访问时,所有的方法都抛出一个NotSupportedException 。 换句话说,它实现了IList接口,但是在运行时违反了这个同样的约定。

为了expression我真的公开了一个不可变列表,我通常使用一个自定义的IIndexable接口,它将Length和一个索引器添加到一个IEnumerable (在这个CodeProject文章中描述)。 这是一个包装,因为它应该已经完成​​在第一个恕我直言。

我没有看到这个选项提到:

 private List<string> myList; public List<string> MyList { get { return myList.AsReadOnly().ToList(); } } 

这应该允许你公开一个只读列表。