一开始,先对C#深拷贝与浅拷贝知识做个简单的总结。

无论是浅拷贝与深拷贝,C#都将源对象中的所有字段复制到新的对象中。不过,对于值类型字段,引用类型字段以及字符串类型字段的处理,两种拷贝方式存在一定的区别(见下表)。

下面给出完整的演示代码。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;namespace DeepCloneExp
{class Program{static void Main(string[] args){Person p = new Person() { Name="tiana0",Age=20,Job=new Job(){JobName="Coder"} };Person p1 = p.ShallowClone();Person p2 = p.DeepClone();Console.WriteLine("p浅拷贝-->p1;p深拷贝-->p2");Console.WriteLine("p修改前:p.Name={0},p.Age={1},p.Job.JobName={2}", p.Name, p.Age, p.Job.JobName);Console.WriteLine("p修改前:p1.Name={0},p1.Age={1},p1.Job.JobName={2}", p1.Name, p1.Age, p1.Job.JobName);Console.WriteLine("p修改前:p2.Name={0},p2.Age={1},p2.Job.JobName={2}", p2.Name, p2.Age, p2.Job.JobName);//修改p的所有字段值p.Name = "tiana10000";p.Age = 28;p.Job.JobName = "Manager";Console.WriteLine();Console.WriteLine("p修改后:p.Name={0},p.Age={1},p.Job.JobName={2}", p.Name, p.Age, p.Job.JobName);Console.WriteLine("p修改后:p1.Name={0},p1.Age={1},p1.Job.JobName={2}", p1.Name, p1.Age, p1.Job.JobName);Console.WriteLine("p修改后:p2.Name={0},p2.Age={1},p2.Job.JobName={2}", p2.Name, p2.Age, p2.Job.JobName);}}[Serializable]class Person:ICloneable {public int Age { get; set; }  //值类型字段public string Name { get; set; }  //字符串public Job Job { get; set; }  //引用类型字段//深拷贝public Person DeepClone(){using (Stream objectStream = new MemoryStream()){IFormatter formatter = new BinaryFormatter();formatter.Serialize(objectStream,this);objectStream.Seek(0, SeekOrigin.Begin);return formatter.Deserialize(objectStream) as Person;}}public object Clone(){return this.MemberwiseClone();}//浅拷贝public Person ShallowClone(){return this.Clone() as Person;}}[Serializable]public class Job{public string JobName { get; set; }public override string ToString(){return this.JobName;}}
}

运行程序,得到以下结果:

先来看看结果,很明显,当源对象改变时,副本只有浅拷贝这种情况下的引用类型字段的值会一起变化,与前面给出的结论一致(不记得的话,麻烦再看一下表格)。

对于演示代码,仅补充说明: Person 类与Job类均需添加标志[Serializable],否则运行时会报错。

好了,就扯到这里了。

转载于:https://www.cnblogs.com/james1207/p/3347924.html

例说C#深拷贝与浅拷贝相关推荐

  1. 深拷贝与浅拷贝、值语义与引用语义对象语义 ——以C++和Python为例

    深拷贝与浅拷贝.值语义与引用语义/对象语义 --以C++和Python为例 值语义与引用语义(对象语义) 本小节参考自:https://www.cnblogs.com/Solstice/archive ...

  2. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  3. C++深拷贝与浅拷贝

    浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以 ...

  4. 深入浅出的“深拷贝与浅拷贝”

    js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题.浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用.但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象, ...

  5. assign深拷贝_前端深拷贝和浅拷贝

    在前端攻城狮的工作实际应用中,有很多情况下在处理数据的时候,会用到数据的深拷贝和浅拷贝 例如:vue中数据是双向绑定的,页面显示依赖于从后台获取到的数据,但要将这个数据当做参数发送给另外一个接口的时候 ...

  6. 通俗易懂讲解JavaScript深拷贝和浅拷贝

    基本类型和引用类型 在开始讲解JavaScript的深拷贝和浅拷贝之前,先要认识JavaScript的两种基本数据类型.一种是基本类型(值类型),另外一种是引用类型.其中基本类型包括undefined ...

  7. [随笔重写] Python3 的深拷贝与浅拷贝

    1. Python3 关于深浅拷贝的官方文档 文档地址:Python3.7.2 源码地址:lib/copy.py 2. 先说结论 深拷贝与浅拷贝是对复合对象而言的 深拷贝会构造一个新的复合对象,然后递 ...

  8. java对象深克隆_JAVA中对象的克隆及深拷贝和浅拷贝

    使用场景: 在日常的编程过程 中,经常会遇到,有一个对象OA,在某一时间点OA中已经包含了一些有效值 ,此时可能会需一个和OA完全相对的新对象OB,并且要在后面的操作中对OB的任何改动都不会影响到OA ...

  9. vue 深度拷贝数组_前端深拷贝和浅拷贝

    在前端攻城狮的工作实际应用中,有很多情况下在处理数据的时候,会用到数据的深拷贝和浅拷贝 例如:vue中数据是双向绑定的,页面显示依赖于从后台获取到的数据,但要将这个数据当做参数发送给另外一个接口的时候 ...

最新文章

  1. 通过anaconda2安装python2.7和安装pytorch
  2. Xen设计的理念--超级调用
  3. Tkinter的listbox组件
  4. astc贴图格式是什么意思_c4d配合AEe3d导入c4d模型贴图及插件安装所有流程
  5. ExtJs中Store简介(秘籍)
  6. 让你受用一辈子的一条CMD命令
  7. 华中师范大学计算机学院郑,郑年亨-华中师范国家数字化研究中心
  8. 电子学会图形化三级编程题解析含答案:冬天下雪了
  9. arping指令linux,arping命令详解
  10. 五款好用的开源CRM系统推荐
  11. asp/php/asp.net网站后台HTML编辑器eWebEditor升级kindeditor编辑器
  12. 超详细傻瓜iPhone自定义来电铃声教程
  13. python连接excel_Python操作Excel
  14. Linux入门第三天——linux命令(二)
  15. 高通量测序与杂交优势
  16. java rmi tcp_Tomcat启动失败报错[RMI TCP Connection(4)-127.0.0.1] [RMI TCP Connection(3)-127.0.0.1]...
  17. win+python实现离线语音识别
  18. 【编程语录】59条令人捧腹但真实的程序员编程语录
  19. arduino 土壤温湿度传感器_【教程】教你玩转Stduino之土壤湿度传感器模块
  20. 我们不生产代码,我们是代码的搬运工

热门文章

  1. Codeforces 898E Squares and not squares
  2. 《SpringBoot揭秘 快速构建微服务体系》读后感(三)
  3. Effective C++ 条款11:在operator=中处理自我赋值
  4. VS配置本地IIS以域名访问
  5. B2C和B2B之间有多大差距
  6. 老工业基地调整改造与振兴
  7. POJ 2409 Let it Bead (Polya定理)
  8. 批量获取远程计算机MAC
  9. WD硬盘 C1门 解决办法
  10. 砂.随笔.二十五.如果你是氧气