我如何公开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;}
答案 0 :(得分:93)
我认为你正在混合概念。
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();}
}
请注意,在第一个代码段中,其他人可以操作List,但无法更改您拥有的列表。在第二个片段中,其他人将获得一个他们无法修改的只读列表。
答案 1 :(得分:11)
如果您希望只读集合使用ReadOnlyCollection<T>
,而不是List<T>
:
public ReadOnlyCollection<string> MyList { get; private set; }
答案 2 :(得分:11)
我更喜欢使用IEnumerable
private readonly List<string> _list = new List<string>();
public IEnumerable<string> Values // Adding is not allowed - only iteration
{
get { return _list; }
}
答案 3 :(得分:10)
返回一个ReadOnlyCollection,它实现了IList&lt;&gt;
private List<string> myList;
public IList<string> MyList
{
get{return myList.AsReadOnly();}
}
答案 4 :(得分:4)
有一个名为ReadOnlyCollection<T>
的集合 - 你正在寻找什么?
答案 5 :(得分:4)
您可以使用List的AsReadOnly()方法返回只读包装。
答案 6 :(得分:4)
private List<string> my_list;
public ReadOnlyCollection<string> myList
{
get { return my_list.AsReadOnly(); }
private set { my_list = value; }
}
答案 7 :(得分:3)
private List<string> _items = new List<string>();
public ReadOnlyCollection<string> Items
{
get { return _items.AsReadOnly(); }
private set { _items = value }
}
答案 8 :(得分:3)
这是一种方式
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");
}
}
答案 9 :(得分:3)
在.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);} }
答案 10 :(得分:2)
private List<string> myList;
public string this[int i]
{
get { return myList[i]; }
set { myList[i] = value; }
}
答案 11 :(得分:1)
为什么使用List。听起来你真正想暴露的是IEnumerable
public IEnumerable<string> myList { get; private set; }
现在,班级用户可以阅读这些项目,但不能更改列表。
答案 12 :(得分:1)
您也可以创建普通列表,但是通过IEnumerable
类型的属性公开它private List<int> _list = new List<int>();
public IEnumerable<int> publicCollection{
get { return _list; }
}
答案 13 :(得分:0)
有点晚了,但是:我不喜欢使用ReadOnlyCollection
包装器,因为它仍然公开了修改集合的所有方法,在运行时访问时都会抛出NotSupportedException
。换句话说,它实现了IList
接口,但在运行时违反了同一个合同。
为了表达我真的暴露了一个不可变列表,我通常使用自定义IIndexable
接口,它将Length和索引器添加到IEnumerable
(在this CodeProject article中描述)。它是一个包装器,因为它应该首先在IMHO中完成。
答案 14 :(得分:-1)
我没有看到提到这个选项:
private List<string> myList;
public List<string> MyList
{
get { return myList.AsReadOnly().ToList(); }
}
这应该允许您公开只读列表。