C# 只读列表,保证不会在yling集合下修改
C# 只读列表,保证不会在yling集合下修改,c#,C#,.net中是否有类似于IReadOnlyList的类,但它保存所有项目的内部副本?如果某个内容返回IReadOnlyList,则不能保证基础集合不会被修改 编辑: 从文件: ReadOnlyCollection泛型类的实例总是 只读。只读的集合只是具有 防止修改集合的包装器因此,如果 对基础集合(只读集合)进行更改 集合==反映==这些更改 所以这不是真的只读 编辑2: 我需要只读数组之类的东西 例如: public class ReadOnlyArray<T> : IEnumera
.net
中是否有类似于IReadOnlyList
的类,但它保存所有项目的内部副本?如果某个内容返回IReadOnlyList
,则不能保证基础集合不会被修改
编辑:
从文件:
ReadOnlyCollection
泛型类的实例总是
只读。只读的集合只是具有
防止修改集合的包装器因此,如果
对基础集合(只读集合)进行更改
集合==反映==这些更改
所以这不是真的只读
编辑2:
我需要只读数组之类的东西
例如:
public class ReadOnlyArray<T> : IEnumerable<T>, ...
{
public ReadOnlyArray (IEnumerable<T> items)
{
internalItems = createCopy (items);
}
}
公共类只读数组:IEnumerable。。。
{
公共只读数组(IEnumerable items)
{
internalItems=createCopy(项目);
}
}
现在当我看到这样的代码时:ReadOnlyArray x=GetDataFrom3rdAPI()
我100%我不仅接收只读对象,而且这是不可能的
在代码中的其他地方修改基础集合。班级类型应该说它给了我这种安慰
使用ReadOnlyCollection时,它说只有我可以阅读,但我无法控制underyling集合-我不知道在第三个API代码的其他地方是否有任何对底层集合的引用
编辑3:
当我说不应该修改基础集合时,我的想法是集合中的所有项(所有引用)都应该指向同一个实例。然而,这些实例本身是可变的
因此,当我迭代这个集合时,我总是迭代相同的实例。是的。您可以使用
ReadOnlyCollection<T>
ReadOnlyCollection
给定任何IEnumerable foo
,请使用foo.ToList().AsReadOnly()
。这将创建一个新的列表
,其中包含foo
的元素,即使它已经是一个列表,然后围绕该列表创建一个只读包装器。由于ReadOnlyCollection
的基础集合是您刚刚创建的集合,因此其他任何集合都不会有对它的引用,因此其他任何集合都无法对其进行更改(将反射保存为傻瓜)。对于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!
您要面对两个不同的问题:
- 确保集合始终包含相同的对象->使用 只读集合
- 确保集合中的每个对象都不能 已修改->集合的类型T必须是不可变的