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必须是不可变的

可能重复@zgnilec您遇到过不可变集合吗?@adamhuldsworth:什么?我需要明确地知道,不能更改underylying集合。所以我认为我需要为自己创建类。@zgnilec根据定义,不可变集合是不可变的。据我记忆所及,它们是从头开始创建的,目的是利用不变性。它们将传达正确的意图,但我需要查看代码。我想立即看到它的只读与不可更改的UunderLiing收集。所以我想我需要创造新的类型。