我有一些List
的课程 - 属性:
class Foo {
private List<int> myList;
}
我想提供对此字段的访问权限仅供阅读。
即。我希望属性可以访问Enumerable,Count等,并且无法访问Clear,Add,Remove等。我怎么能这样做?
答案 0 :(得分:26)
如果您想要列表的只读视图,可以使用ReadOnlyCollection<T>
。
class Foo {
private ReadOnlyCollection<int> myList;
}
答案 1 :(得分:12)
您可以使用List<T>
ReadOnlyCollection<T>
公开为AsReadOnly()
class Foo {
private List<int> myList;
public ReadOnlyCollection<int> ReadOnlyList {
get {
myList.AsReadOnly();
}
}
}
巧妙的是,如果您从私人列表中添加/删除任何内容,它也会反映在返回的ReadOnlyCollection
中答案 2 :(得分:9)
我会去
public sealed class Foo
{
private readonly List<object> _items = new List<object>();
public IEnumerable<object> Items
{
get
{
foreach (var item in this._items)
{
yield return item;
}
}
}
}
答案 3 :(得分:5)
现在有一个Immutable Collections库正是这样做的。您可以通过nuget安装。
从.NET开始支持不可变集合类 框架4.5。
https://msdn.microsoft.com/en-us/library/dn385366%28v=vs.110%29.aspx
System.Collections.Immutable命名空间提供通用的不可变 可用于这些方案的集合类型,包括: ImmutableArray&LT; T&gt;中 ImmutableDictionary&LT; TKEY,TValue&gt;中 ImmutableSortedDictionary&lt; T&gt;,ImmutableHashSet&lt; T&gt;, ImmutableList&lt; T&gt;,ImmutableQueue&lt; T&gt;,ImmutableSortedSet&lt; T&gt;, ImmutableStack&LT; T&GT;
用法示例:
class Foo
{
public ImmutableList<int> myList { get; private set; }
public Foo(IEnumerable<int> list)
{
myList = list.ToImmutableList();
}
}
答案 4 :(得分:0)
如果您在班级中声明了一个只读列表,您仍然可以向其中添加项目。
如果您不想添加或更改任何内容,则应按照Darin的建议使用ReadOnlyCollection<T>
。
如果要添加,删除列表中的项目但不想更改内容,可以使用readonly List<T>
。