• 技术文章 >后端开发 >C#.Net教程

    .NET框架-Clone如何由浅变深的示例代码详解

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

    这便要求深度复制了!

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

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

    简历模型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";

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

    php入门到就业线上直播课:查看学习

    以上就是.NET框架-Clone如何由浅变深的示例代码详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:.NET框架-Clone详请介绍 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言本身有没有输入输出语句• c语言中源文件编译后生成什么文件• c语言中的标识符是由什么组成• c语言中关键字有多少个• c语言中case是什么意思
    1/1

    PHP中文网