什么是这种类型的副本,这是不好的做法?

时间:2010-10-11 03:34:54

标签: language-agnostic

浅拷贝就是当我写新的List<List<ClassA>>(lsA)时,只复制成员ls。如此浅,复制第一个列表,而内部列表不是。由于MyList可以访问每个被放入的T(在这个例子中它只是通过C#的List进行管道),因此它可以对每个T进行浅层复制。所以现在正在复制MyList的所有成员以及它可以直接访问的变量。

这是什么类型的副本?它只在内部变量上做一个浅拷贝所以这不是一个深刻的副本?因为它的复制变量它可以触摸而不仅仅是成员变量它不再是浅拷贝。这种类型的副本被称为什么?这也是不好的做法,因为它不是一个很深的副本,可能没有比浅拷贝更有用了吗?

class ClassA { int a; }
class MyList<T> { List<T> ls; /*i cheat */ }
MyList<MyList<ClassA>> lsA;

1 个答案:

答案 0 :(得分:0)

我真的不确定底部的代码是什么意思,但是,无论如何这是我的看法(并且问题不是与语言无关):

如果数据(对象)是不可变的,那么副本的类型大部分是静音的(实际上,没有理由使用不可变对象进行深度复制!)。通过减少不变量,我通常没有深拷贝(几乎所有),使用标准构造函数的“浅拷贝”效果很好。

请注意,对于List&lt; T&gt;,有一个ctor List<T>(IEnumerable<T> collection)。这反过来只是创建新对象依次添加来自现有Enumerable的每个元素,并且规则遵循标准的“ref”/“struct”类型行为(请记住,结构类型可以以令人惊讶的方式装箱)。 请注意,此构造函数不是“复制变量”:而是复制传入的Enumerable的项目对象值(这样做暗示为“ref”对象创建重复对象)。