要做到這一點,並且正確地做到這一點,唯一的方法就是自己實現副本。舉個例子:
public class FrobAndState
{
public Frob Frobber { get; set;}
public bool State { get; set; }
}
public class Frob
{
public List<int> Values { get; private set; }
public Frob(int[] values)
{
Values = new List<int>(values);
}
}
在這個例子中你需要知道 FROB是如何實現的,即你需要調用構造函數是隻讀的創建一個副本作爲價值的事實,能夠複製給定的FrobAndState實例。
而且 - 你不能只是實現FrobAndState.Copy正是如此:
public class FrobAndState
{
// ... Properties
public FrobAndState Copy()
{
var new = new FrobAndState();
new.State = this.State;
new.Frobber = this.Frobber;
}
}
因爲無論你在叫.Copy()的FrobAndState的實例,新的實例就都有的一個參考Frobber的同一個實例。
總之,複製東西是硬和任何複製實現是很難得到正確的。
來源
2010-03-26 08:51:53
Rob
@Brian,手寫複製構造函數耗時過長的原因是我需要爲主類(** PushPin **)使用的其他類編寫複製構造函數。 – 2010-03-26 09:11:11