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
那么这样做:
List
foreach(int i in originalList)
newList.Add(i);
会得到一个克隆列表。
但是,如果您尝试使用List generic在某些引用类型上执行的操作,那么您将无法成功。 更改列表中的一个对象后,您将看到更改的版本,无论是从原始列表还是新列表引用它。
简短的回答,是的。
答案很长,您需要确定案例中的副本实际上对列表的意义。 您是否还需要列表内容的副本? 对于像int这样的值类型,它非常简单,如果它是引用类型….你有一些问题要询问你希望列表包含什么。