我有一个包含List<Item>
的类我在类上有一个getter来返回它。我可以做些什么来确保调用的用户无法修改返回的List吗? (因为它是一个引用类型 - 我相信对返回引用的更改会影响存储在源对象中的列表)
答案 0 :(得分:8)
返回包含在ReadOnlyCollection<T>
中的列表。
public ReadOnlyCollection<Item> MyROList {
get { return new ReadOnlyCollection<Item>(myList); }
}
private List<Item> myList = new List<Item>();
更多详情elsewhere on SO。
根据您班级的使用情况,您可以在施工时分配ReadOnlyCollection
并将其链接到基础List
。如果您希望总是或大部分时间都需要此属性,并且当时基础List
已到位,那么这是明智的。否则,您可以离开ReadOnlyCollection<Item>
类成员null
并在getter中按需分配它null
(考虑到线程安全性)。
答案 1 :(得分:4)
您是否希望将来您的类所做的任何更改都反映在返回的列表中?如果是这样,只需
return new ReadOnlyCollection<T>(list);
没关系。
但是,如果您想要返回 nothing 将来会修改的集合(即原始列表的完全独立的副本),您可能想要使用:
return new ReadOnlyCollection<T>(list.ToList());
(使用LINQ的ToList
方法是克隆列表的一种非常简单的方法。)
请注意,如果列表的元素类型是可变引用类型,那么当前对所有人仍然可以看到对引用对象中数据的更改。