首页 > 代码库 > C#Copy

C#Copy

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; } }

 

C#Copy