C#返回不可修改的列表

时间:2010-10-02 15:23:11

标签: c# .net properties readonly modifier

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

2 个答案:

答案 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方法是克隆列表的一种非常简单的方法。)

请注意,如果列表的元素类型是可变引用类型,那么当前对所有人仍然可以看到对引用对象中数据的更改。