1、浅拷贝(值类型):
public class LightCopy { public int Val { get; set; } public LightCopy(int ival) { Val = ival; } public object getCopy() { return MemberwiseClone(); //浅表副本 } }
测试代码及结果
LightCopy lcopy = new LightCopy(8); MessageBox.Show("" + lcopy.Val); //8 LightCopy lcopy1 = (LightCopy)lcopy.getCopy(); MessageBox.Show("" + lcopy1.Val); //8 lcopy1.Val = 3; MessageBox.Show("" + lcopy1.Val); //3 MessageBox.Show("" + lcopy.Val); //8
2、浅拷贝(引用类型):
public class Content { public int Val { get; set; } } public class LightCopy { public Content myContent; public LightCopy(int val) { myContent = new Content(); myContent.Val = val; } public object getCopy() { return MemberwiseClone(); } }
测试代码及结果
LightCopy lcpy = new LightCopy(8); MessageBox.Show("" + lcpy.myContent.Val); //8 LightCopylcpy1 = (DeepCopy)lcpy.getCopy(); MessageBox.Show("" + lcpy1.myContent.Val); //8 lcpy.myContent.Val = 3; MessageBox.Show("" + lcpy1.myContent.Val); //3 MessageBox.Show("" + lcpy.myContent.Val); //3
3、深拷贝
#region ICloneable 成员 //如果类型继承自ICloneable,但是同时它不是一个Sealed类型的话,它们的子类的默认Clone方法会带来BUG(子类的Clone方法会返回父类的副本,而不是子类本身)。这会逼迫所有的子类都重写Clone方法; public object Clone() { //DeepCopy deepcpy = new DeepCopy(myContent.Val); return this.MemberwiseClone();//浅拷贝 } #endregion //深拷贝
public DeepCopy DeepClone() { using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream, this); objectStream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectStream) as DeepCopy; } }