浅度复制
当对一个对象进行浅度复制的时候,对于值类型成员,会复制其本身;对于引用类型成员,仅仅复制引用。复制后的对象和原先对象成了“连体婴”,它们的引用成员字段依然引用堆上的同一个对象。
可以推出这样一个结论:当复制一个结构类型成员时,直接创建一个新的结构类型变量,然后对它赋值,就相当于进行了一个浅度复制。
如果是引用类型,可以实现ICloneable接口。在Clone方法中,调用受保护的MemberwiseClone()方法。
public object Clone() { return MemberwiseClone(); }
深度复制
深度复制就是对所有成员都创建一个新的副本。
深度复制根据复制的对象,可能会变得非常复杂。可以利用序列化/反序列化来对对象进行深度复制:先把对象序列化到内存中,然后再进行反序列化。不过要注意,所有相关对象都必须使用Serializable特征进行标记。
public object Clone() { BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, this); ms.Position = 0; return bf.Deserialize(ms); }