C# – 列表成员需要深层复制吗?

我有一个List成员的类。 如果我想克隆这个类的实例,我是否需要深层复制或者MemberwiseClone()浅拷贝就足够了?

如果至少有一个成员是对象的引用,我们需要一个深层副本,对吗? 这是否意味着拥有List,DateTime,String,MyClass,……,是否需要深层复制?

这完全取决于您计划如何使用副本。

如果你做一个浅的副本

 List x = new List() { 1, 2, 3, 4, 5 }; List y = x; y[2] = 4; 

然后x将包含{1,2,4,4,5}

如果您执行列表的深层复制:

 List x = new List { 1, 2, 3, 4, 5 }; List y = new List(x); y[2] = 4; 

然后x将包含{1,2,3,4,5},y将包含{1,2,4,4,5}

您计划如何使用副本确实决定了您使用浅拷贝还是深拷贝。

如果你有List originalList = new List{1, 2}那么这样做:
List newList = new List();
foreach(int i in originalList)
newList.Add(i);

会得到一个克隆列表。

但是,如果您尝试使用List generic在某些引用类型上执行的操作,那么您将无法成功。 更改列表中的一个对象后,您将看到更改的版本,无论是从原始列表还是新列表引用它。

简短的回答,是的。

答案很长,您需要确定案例中的副本实际上对列表的意义。 您是否还需要列表内容的副本? 对于像int这样的值类型,它非常简单,如果它是引用类型….你有一些问题要询问你希望列表包含什么。