2010-04-24 106 views
4

如果有如何在使用数组复制结构时强制执行深层复制?

struct A { 
    public double[] Data; 
    public int X; 
} 

我如何使用operator=或添加的A实例到容器中时迫使深拷贝?

的问题,例如:

A a = new A(); 
var list = new List<A>(); 
list.Add(a); // does not make a deep copy of Data 
A b = a; // does not make a deep copy of Data 

难道我真的要实现自己的DeepClone方法,并调用它的每一次?这将极易出错......

回答

3

一般而言,您应该避免将可变引用类型(如数组)放入结构中。见this question并回答。

因此,让您的课程成为参考类型并为其指定一个DeepCopy方法。甚至更好 - 让你的类型不可变,这样你就不需要复制。

+0

+1:如果可以的话,保持简单的类不变是很好的,因为它减少了使用它们时发生错误的可能性。例如,即使您实施了Deep Copy,也不能保证代码的使用者会真正使用它。特别是在结构上,可变性是相当意想不到的。 – 2010-04-24 21:57:46

1

您需要自己实施深度复制方法。

常常API设计师设计的clone()克隆(布尔深),或复制()方法做到这一点。

ICloneable有时用于标记类是可复制的,但它可能会造成混淆,因为它没有指定Clone()方法是深度还是浅度。 Why should I implement ICloneable in c#?

0

没办法做到这一点。您需要实现自己的深层复制机制。