4

我有一个类,其中包含一个List<Item>我在返回这个的类上有一个吸气剂。我可以做些什么来确保调用的用户不能修改返回的列表?(因为它是引用类型 - 我相信对返回引用的更改会影响存储在源对象中的列表)

4

2 回答 2

9

返回包裹在ReadOnlyCollection<T>.

  public ReadOnlyCollection<Item> MyROList {
    get { return new ReadOnlyCollection<Item>(myList); }
  }

  private List<Item> myList = new List<Item>();

SO 其他地方的更多细节。

根据您的类的使用情况,您可以分配ReadOnlyCollectionat 构建时间并将其链接到底层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 回答