列出<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(); } }
这应该允许你公开一个只读列表。
- DataContractSerializer vs XmlSerializer:每个序列化程序的优点和缺点
- Resharper Ctrl-T映射丢失
- AppSettings从.config文件获取值
- 在C#中访问简单的布尔标志时,是否需要locking或标记为volatile?
- 如何从它的hexRGBstring创build一个System.Drawing.Color?
- 如何在.Net / C#中将date转换为HTTP格式的date
- 在.NET中比较两个字节数组
- 实体框架与LINQ to SQL
- 无法加载文件或程序集“System.Net.Http.Formatting”或其依赖项之一。 该系统找不到指定的path