我有一个类,其中包含一个List<Item>
我在返回这个的类上有一个吸气剂。我可以做些什么来确保调用的用户不能修改返回的列表?(因为它是引用类型 - 我相信对返回引用的更改会影响存储在源对象中的列表)
问问题
3532 次
2 回答
9
返回包裹在ReadOnlyCollection<T>
.
public ReadOnlyCollection<Item> MyROList {
get { return new ReadOnlyCollection<Item>(myList); }
}
private List<Item> myList = new List<Item>();
SO 其他地方的更多细节。
根据您的类的使用情况,您可以分配ReadOnlyCollection
at 构建时间并将其链接到底层List
. 如果您期望始终或大部分时间都需要此属性,并且当时标的List
已经到位,那么这是明智的。否则,您可以离开ReadOnlyCollection<Item>
类成员null
并在 getter 中按需分配它null
(考虑到线程安全)。
于 2010-10-02T15:26:37.613 回答
4
您希望您的班级将来所做的任何更改都反映在返回的列表中吗?如果是这样,只需
return new ReadOnlyCollection<T>(list);
会好的。
但是,如果您想返回一个将来不会修改的集合(即原始列表的完全独立副本),您可能希望使用:
return new ReadOnlyCollection<T>(list.ToList());
(使用 LINQ 的ToList
方法是一种非常简单的克隆列表的方法。)
请注意,如果列表的元素类型是可变引用类型,那么对引用对象中数据的更改当然仍然对所有人可见。
于 2010-10-02T15:28:55.243 回答