要做到这一点,并且正确地做到这一点,唯一的方法就是自己实现副本。举个例子:
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