Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

C#.NET: 如何由浅复制变为深复制?

$
0
0

作者:vuefine
文献:大话设计模式 | 程杰
平台:.NET 2.0+


有的场合下,我们需要浅复制便能解决问题,因为我们复制出来的实例,仍然引用原来的初始对象。但是有的时候,这是不够的,因为我们复制出来的实例,还要对引用类型做出局部值的修改调整,并且保证不能影响初始对象!

这便要求深度复制了!

需求是这样的:
首先看一下浅复制为什么不能满足我们的要求:我们要复制简历,并且复制出的版本只与模板简历的求职意向中的公司名称不一致。

我们的第一版代码是这样的:

简历模型1.0版本

    public class ResumeInfo1:ICloneable
    {

        public ResumeInfo1(string name, string telephone, EducationInfo educationInfo,WantedJob1 job)
        {
            this._name = name;
            this._telephone = telephone;
            this._educationInfo = educationInfo;
            this._wantedJob = job;
        }

        private string _name;
        public string name
        {
            get { return this._name; }
        }

        private string _telephone;
        public string telephone
        {
            get { return _telephone; }
        }

        private EducationInfo _educationInfo;
        public EducationInfo educationInfo
        {
            get { return _educationInfo; }
        }

        private WantedJob1 _wantedJob;
        public WantedJob1 WantedJob
        {
            get { return _wantedJob; }
        }

        public object Clone()
        {

           return this.MemberwiseClone();
        }


    }

里面嵌套的子类教育背景对象EducationInfo

    public class EducationInfo
    {
        public string schoolName { get; set; }
        public DateTime enrollTime { get; set; }
        public DateTime leaveTime { get; set; }
    }

还有嵌套的对象WantedJob1:

    public class WantedJob1
    {
        public string companyName { get; set; }

        public double eanrings { get; set; }

    }

我们在客户端使用下:

            EducationInfo educationInfo = new EducationInfo();
            WantedJob1 wantedJob = new WantedJob1();
            ResumeInfo1 templateResume = new ResumeInfo1("qaz", "18810002000", educationInfo, wantedJob);
            educationInfo.enrollTime = new DateTime(2010, 7, 1);
            educationInfo.leaveTime = new DateTime(2015, 1, 1);
            educationInfo.schoolName = "wsx";
            wantedJob1.companyName = "edc";
            wantedJob1.eanrings = 1000;

            //假定各个简历版本,仅仅companyName属性值不同。

            var res1 = templateResume.Clone();
            (res1 as ResumeInfo1).WantedJob.companyName = "baidu";

            var res2 = templateResume.Clone();
            (res1 as ResumeInfo1).WantedJob.companyName = "ali";

但是我们得到了公司名称都是”ali”

这是典型的浅复制!

不能满足公司名称要区分的要求,继续修改,变为深度复制:

    public class ResumeInfo2:ICloneable
    {

        public ResumeInfo2(string name, string telephone, EducationInfo educationInfo,WantedJob2 job)
        {
            this._name = name;
            this._telephone = telephone;
            this._educationInfo = educationInfo;
            this._wantedJob = job;
        }

        //
        private void cloneJob(WantedJob2 job)
        {
            this._wantedJob = job.Clone() as WantedJob2;
        }

        private string _name;
        public string name
        {
            get { return this._name; }
        }

        private string _telephone;
        public string telephone
        {
            get { return _telephone; }
        }

        private EducationInfo _educationInfo;
        public EducationInfo educationInfo
        {
            get { return _educationInfo; }
        }

        private WantedJob2 _wantedJob;
        public WantedJob2 WantedJob
        {
            get { return _wantedJob; }
        }

        public object Clone()
        {
            cloneJob(this._wantedJob);
            return new ResumeInfo2(_name,_telephone,_educationInfo,_wantedJob);          
        }


    }

求职意向对象2.0:

   //WantedJob2 实现接口
    public class WantedJob2:ICloneable
    {
        public string companyName { get; set; }

        public double eanrings { get; set; }

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

客户端调用:

            //此处我们需要对WantedJob做深复制处理。

            EducationInfo educationInfo = new EducationInfo();
            WantedJob2 wantedJob = new WantedJob2();
            ResumeInfo2 templateResume = new ResumeInfo2("qaz", "18810002000", educationInfo, wantedJob);
            educationInfo.enrollTime = new DateTime(2010, 7, 1);
            educationInfo.leaveTime = new DateTime(2015, 1, 1);
            educationInfo.schoolName = "wsx";
            wantedJob.companyName = "edc";
            wantedJob.eanrings = 1000;

            //假定各个简历版本,仅仅companyName属性值不同。

            var res1 = templateResume.Clone();
            (res1 as ResumeInfo2).WantedJob.companyName = "baidu";

            var res2 = templateResume.Clone();
            (res2 as ResumeInfo2).WantedJob.companyName = "ali";

得到不同的公司名称!深度复制成功!

我测试的源码下载地址:
http://download.csdn.net/detail/daigualu/9772853

作者:daigualu 发表于2017/3/7 12:56:40 原文链接
阅读:30 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>