2010-04-24 65 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

沒辦法做到這一點。您需要實現自己的深層複製機制。