如何在使用get属性公开List的同时使List的Add方法受到保护?
我有一个名为WhatClass的类,其中包含List字段。 我需要能够只读这个字段,所以我使用get属性将它暴露给其他对象。
public class WhatClass { List _SomeOtherClassItems; public List SomeOtherClassItems { get { return _SomeOtherClassItems; } } }
然而事实certificate任何对象都可以调用
WhatClass.SomeOtherClassItems.Add(item);
我怎么能阻止这个?
正如其他人所说,您正在寻找.AsReadOnly()
扩展方法。
但是,您应该存储对集合的引用,而不是在每次属性访问期间创建它:
private readonly List _items; public WhatClass() { _items = new List (); this.Items = _items.AsReadOnly(); } public ReadOnlyCollection Items { get; private set; }
这是为了确保x.Items == x.Items
成立,否则API消费者可能会非常意外。
公开ReadOnlyCollection<>
将您的只读集合的意图传达给消费者。 对_items
更改将反映在Items
。
使用List
:
public ReadOnlyCollection SomeOtherClassItems { get { return _SomeOtherClassItems.AsReadOnly(); } }
这将返回一个ReadOnlyCollection ,如果客户端通过接口调用Add,则会抛出exception。 此外,ReadOnlyCollection类型不公开公共Add方法。
您正在寻找ReadOnlyCollection
类 ,它是IList
的只读包装器。
由于ReadOnlyCollection
将反映基础列表中的更改,因此您不需要每次都创建新实例。
例如:
public class WhatClass { public WhatClass() { _SomeOtherClassItems = new List(); SomeOtherClassItems = _SomeOtherClassItems.AsReadOnly(); } List _SomeOtherClassItems; public ReadOnlyCollection SomeOtherClassItems { get; private set; } }
使用AsReadOnly()
怎么样? – MSDN文档