只读列表,保证不会收集底层收集

时间:2015-11-09 14:20:32

标签: c#

.net中是否有类似IReadOnlyList的类,但它包含所有项目的内部副本?如果某些内容返回IReadOnlyList,则无法保证不会修改基础集合?...

编辑:

来自文档:

  

ReadOnlyCollection<T>泛型类的实例始终是   只读。只读集合只是一个集合   一个阻止修改集合的包装器; 因此,如果   对基础集合(只读)进行更改   集合==反映==那些变化

所以这不是真的只读。

EDIT2:

我需要像只读数组这样的东西。

例如:

public class ReadOnlyArray<T> : IEnumerable<T>, ...
{
    public ReadOnlyArray (IEnumerable<T> items)
    {
          internalItems = createCopy (items);
    }
}

现在我看到这样的代码:ReadOnlyArray x = GetDataFrom3rdAPI();

我是100%我不仅收到只读对象,而且也不可能 在代码中的其他地方修改底层集合。班级类型应该说它给了我那种安慰。

使用ReadOnlyCollection,它只说我可以阅读,但我无法控制底层集合 - 我不知道在第三个API代码的其他地方是否有对底层集合的引用。

EDIT3:

当我说底层集合不应该被修改时,我想到集合中的所有项目(所有引用)都应该始终指向同一个实例。然而,这些实例本身可能是可变的。

所以当我迭代这个集合时,我总是迭代相同的实例。

3 个答案:

答案 0 :(得分:3)

如果有IEnumerable<T> foo,请使用foo.ToList().AsReadOnly()。这将创建一个包含List<T>元素的新foo,即使它已经是一个列表,然后围绕该列表创建一个只读包装。由于ReadOnlyCollection<T>的基础集合是您刚刚创建的集合,因此没有其他任何内容可以引用它,因此没有其他任何内容可以更改它(保存反射tomfoolery)。

答案 1 :(得分:0)

使用ReadOnlyCollection集合,您确信客户端代码无法修改集合,即添加或删除集合中的元素。但客户端代码仍然可以修改集合中包含的项目:

myReadOnlyCollection.Add(new Object())// error, cannot add/remove items to readonlyCollection
MyObjet obj = myReadOnlyCollection[3] // get the 3rd item in the collection, ok;

obj.someProperty = 9; // ops, the object contained in the ReadOnlyCollection has been changed!

你有两个不同的问题:

  • 确保您的收藏集始终包含相同的对象 - &gt;使用 readOnlyCollections
  • 确保集合中的每个对象都不能 修改 - &gt;集合的类型T必须是不可变的

答案 2 :(得分:-1)

是。您可以使用

的实例
ReadOnlyCollection<T>