.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:
当我说底层集合不应该被修改时,我想到集合中的所有项目(所有引用)都应该始终指向同一个实例。然而,这些实例本身可能是可变的。
所以当我迭代这个集合时,我总是迭代相同的实例。
答案 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!
你有两个不同的问题:
答案 2 :(得分:-1)
是。您可以使用
的实例ReadOnlyCollection<T>