0

0

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

黄舟

黄舟

发布时间:2017-03-18 13:20:08

|

1467人浏览过

|

来源于php中文网

原创

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

这便要求深度复制了!

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

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

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

    }

我们在客户端使用下:

LALAL.AI
LALAL.AI

AI人声去除器和声乐提取工具

下载
            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";

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.7万人学习

React 教程
React 教程

共58课时 | 4.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号