.net 对象浅拷贝和深拷贝的实现

来源:互联网 发布:测评软件 编辑:程序博客网 时间:2024/05/22 05:01

对象A浅拷贝到对象B,A和B实际是同一个引用,改变A就会改变B。

对象A深拷贝到对象B,B是一个全新的对象,与A只是值相同。

 具体实现:

方法1:继承接口ICloneable

public class Class1:ICloneable
    {
        int m_member1;
        string m_member2;
        Class2 m_obj;
       
        /// <summary>
        /// 浅拷贝
        /// </summary>
        /// <returns></returns>
        public Object Clone()
        {
            return this.MemberwiseClone();
        }

        /// <summary>
        /// 深拷贝
        /// </summary>
        /// <returns></returns>
        public Object Clone()
        {
            Class1 ret = new Class1();//new一个新对象
            ret.m_member1 = this.m_member1;//给新对象成员赋上一样的值
            ret.m_member2 = this.m_member2;
            ret.m_obj = (Class2 )this.m_obj.Clone();//新对象中有其他复杂类成员时,不要直接赋值,而是对成员进行深拷贝。
            return ret;//将新对象返回
        }
    }
    public class Class2:ICloneable
    {
        string m_str;
        /// <summary>
        /// 深拷贝
        /// </summary>
        /// <returns></returns>
        public Object Clone()
        {
            Class2 ret = new Class2();
            ret.m_str = this.m_str;
            return ret;
        }
    }

 

使用:

Class1 A = new Class1();
Class1 B = A.Clone();//对A进行深拷贝或浅拷贝


方法2:自定义带拷贝功能的构造函数

public class Class1
    {
        int m_member1;
        string m_member2;
        Class2 m_obj;
        

public Class1()

{

}
        public Class1(Class1 org,bool deepCopy)

{

this.m_member1=org,m_member1;

this.m_member2=org.m_member2;

if(deepCopy)

this.m_obj= (Class2 )this.m_obj.Clone();//深拷贝

else

this.m_obj=org.m_obj;//浅拷贝

    }
    public class Class2
    {
        string m_str;
    }

使用:

Class1 A=new Class1 ();

Class1 B=new Class1(A,true);//深拷贝

Class1 C=new Class1(A,false);//浅拷贝


0 0