浅谈.net平台下深拷贝和浅拷贝(2)

public object Clone()
        {
            //浅拷贝
            return this.MemberwiseClone();

//深拷贝
            ClassB obj = new ClassB();
            obj.Member = (ClassA)Member.Clone();
            return obj;
        }
    }

分析:

上例中,ca2复制ca对象,实现了深度拷贝。结果如同代码中显示:ca2中值类型字段的改变并不影响ca中的字段。

在类ClassB中,引用类型成员Member,如果用ClassA中的clone方法实现则仅仅实现的是浅拷贝,在上述参考代码中能够看出:对cb2的member的改变影响着cb。但是当使用参考代码中的深度拷贝后,对cb2的member的改变则不会影响着cb。

在网上找到一个综合的例子,有对比的来进行解释深浅拷贝:

实例1:

复制代码 代码如下:


public class Sex:ICloneable
    {
        private string _PSex;
        public string PSex
        {
            set{ _PSex = value;}
            get { return _PSex; }
        }

//public object Clone()
        //{
        //    return this.MemberwiseClone();
        //}
    }

public class Person : ICloneable
    {

private Sex sex = new Sex();
        public int aa = 3;

public string pSex
        {
            set { sex.PSex = value; }
            get { return sex.PSex; }
        }
        private string _PName;
        public string PName
        {
            set { this._PName = value; }
            get { return this._PName; }
        }

public void ShowPersonInfo()
        {
            Console.WriteLine("-------------------------");
            Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex);
            Console.WriteLine("-------------------------");
            Console.WriteLine(this.aa);
        }
        //浅拷贝
        public object Clone()
        {
            return this.MemberwiseClone();
        }
        //深拷贝
        public object DeepClone()
        {
            Person newP = new Person();
            newP.PName = this._PName;
            newP.pSex = this.pSex;
            return newP;
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("原对象:");
            Person p = new Person();
            p.PName = "Lee";
            p.pSex = "男";

p.ShowPersonInfo();//原对象:lee 男 3

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgywd.html