3

假设我的课堂上有一本私人词典或一个列表。我想返回一个只读枚举器,以便其他人可以遍历列表,但无权修改项目。

我不想围绕原始创建包装类,而是希望返回原始项目/元素的副本。会original.ToList<Type>().GetEnumerator()返回一个包含原始项目引用的列表,还是一个包含原始项目副本的列表?

我应该注意我还需要索引(即通过索引访问项目,仍然无法修改它们)。

4

3 回答 3

5

这些方法创建集合的新实例,但项目引用仍将指向旧项目。换句话说,消费者无法更新您的内部集合,但他们可以自己更新项目。

假设您对修改项目进行了适当的封装,这种方法将起作用,尽管对于较大的列表它有点占用内存,因为您需要为每个新项目引用分配内存。这就是为什么通常首选返回包装器的原因之一:它减少了包装器类的单个实例所需的额外内存。

于 2012-08-01T21:59:25.853 回答
3

ToList()两者Torray()按价值工作。他们只是将值从原始容器复制IEnumerable<>到新容器。

但是被复制的值很可能是引用。

于 2012-08-01T22:09:12.993 回答
2

直接调用

original.ToList<MyType>()

将创建一个“浅”副本:列表将是新的,但对象将是相同的。

如果您更喜欢“深”副本,可以使用 LINQ 复制您的项目,然后再将它们添加到列表中:

original.Select(item => new MyType(item)).ToList()

假设你的类有一个构造函数,它接受一个自身的实例并生成一个副本,类似于 C++ 的复制构造函数,这将生成你的对象的副本列表。

于 2012-08-01T22:04:27.907 回答