例说C#深拷贝与浅拷贝

一开始,先对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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业架构 - 开篇:TOGAF介绍

在《年度总结和计划:去年4个1,今年5个1》中说过今年我准备在项目组引入一个架构方TOGAF。工业和信息化部副部长杨学山在一次内部座谈时提到:与西方发达国家比,国内的信息化建设在硬件方面已经不相上下,在软件方面有5年…

C#(4) implicit explicit

最近几节课学的知识点的量有很大增长,加上上机和托福考试的临近,这里练习的所有代码就不走形式全贴出来了,找我自己觉得又不熟悉的点贴出来,争取简明扼要,恩恩 这次主要看接口的问题: 接口可以多继承&#…

【jquery】基于 jquery 实现 ie 浏览器兼容 placeholder 效果

placeholder 是 html5 新增加的属性,主要提供一种提示(hint),用于描述输入域所期待的值。该提示会在输入字段为空时显示,并会在字段获得焦点时消失。placeholder 属性适用于以下类型的 input 标签:text, se…

连接远程电脑中的虚拟机---端口映射

连接远程电脑中的虚拟机---端口映射问题:A主机中运行有2台虚拟机,现在我们希望在B主机中通过ssh(或其他方式)访问A主机中的2台虚拟机。(前提:B主机可以ping通A主机,即A有公网IP或A、B在同一子网下) 解决方法 设置虚拟…

Unity 动画属性

在动画的使用上使用不当的设置往往会造成不可预料的结果。 首先,如果动画自身可以驱动物体移动,那么在Animator组件上必须选择apply root motion,物体的动画位移才能生效,否则动画只能在原地播放。 第二,Bake Into Pos…

Javascript正则匹配数字,中英文,中横线,下划线,utf-8中文

为什么80%的码农都做不了架构师?>>> function check_string(nickname) {var reg /^[A-Za-z0-9-_\u4e00-\u9fa5]{4,30}$/;if (!reg.test(nickname)) {return false;}return true; } 转载于:https://my.oschina.net/biezhi/blog/396989

基于linux的集群系统LVS

一 LVS (Linux Virtual Server)针对高可伸缩、高可用网络服务的需求,我们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务…

jQuery 开发环境搭配(转)

jQuery 作为一个轻量级的 JavaScript 库,至 06 年出来到现在, 也算是用得最火的 JavaScript 库了吧, 要开始学习 jQuery ,首先还是必须得把环境搭配好吧, 这一篇博文呢,主要是想介绍一下在 Dreamweaver 上和…

Connection to node 0 (/192.168.204.131:9092) could not be established

解决连接虚拟机内kafka出现Connection to node 0 /192.168.204.131:9092 could not be established.Broker may not be available.问题: 在我尝试使用Springboot集成虚拟机内运行的kafka服务器时,出现了以下问题。 原因:可能出现的原因主要有…

获取本机MSSQL保存凭证

本文转自王子博客:http://www.cnblogs.com/killbit/p/4355950.html 首先要感谢哥们对我的指点,多谢。 当我们遇到类似情况下,如何获取保存在MSSQL工具里的凭证呢? //如果对方连接地址后面加了IP\sqlexpress 连接的时候你也记得加上…

【读书笔记-数据挖掘概念与技术】数据挖掘的发展趋势和研究前沿

复杂的数据类型 数据挖掘的其他方法 关于数据挖掘基础的观点: 可视和听觉数据挖掘 数据可视化数据挖掘结构可视化数据挖掘过程可视化交互式可视数据挖掘数据挖掘的应用

解决torch.cuda.is_available()为False的问题

解决torch.cuda.is_available为False问题:在Anaconda环境下,电脑拥有GPU并且已经通过conda install安装了Pytorch、cudatoolkit,但是torch.cuda.is_available()始终返回False(找不到显卡) 原因:使用conda …

如何解决ORA-04031错误

诊断并解决ORA-04031错误 当我们在共享池中试图分配大片的连续内存失败的时候,Oracle首先清除池中当前没使用的所有对象,使空闲内存块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生ORA-04031错误。 当这个错误出现的时候你得到的…

Idea新建modules后无法自动导入pom.xml

Idea新建modules后无法自动导入pom.xml打开设置,搜索Maven,打开Importing,将红色箭头部分勾选 打开Ignored Files,将红色箭头部分都取消勾选 点击右侧工具栏的maven选项,点击红色箭头部分的Reimport All Maven Proje…

宝剑锋从磨砺出——使用在线评测平台磨砺C#使用能力

学数学的时候,我们通常会通过大量的练习题来巩固所学知识;其实学习程序设计设计语言也不例外。那么如何通过练习去磨砺自己的C#使用能力呢?一个方法是参与到实际的软件项目开发中,而另一个更加直接的方法则是“做题”。 去哪里找练…

java多线程学习-java.util.concurrent详解(一) Latch/Barrier

2019独角兽企业重金招聘Python工程师标准>>> Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起,我将跟大家一起共同…

Java Websocket实例

2019独角兽企业重金招聘Python工程师标准>>> 介绍 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新…

Go学习笔记—并发高级

Go并发机制 ​ 协程:一个线程可以对应多个协程,协程串行运行在用户空间。协程运行在线程之上,当一个协程执行完成后,可以选择主动让出,让另一个协程运行在当前线程之上。协程并没有增加线程数量,只是在线程…

设计模式C++学习笔记之十三(Decorator装饰模式)

装饰模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 13.1.解释 main(),老爸 ISchoolReport,成绩单接口 CFourthGradeSchoolReport,四年级成绩单 ReportDecorator&…

程序员编程艺术:第二章、字符串是否包含问题

程序员编程艺术:第二章、字符串是否包含及相关问题扩展 作者:July,yansha。时间:二零一一年四月二十三日。致谢:老梦,nossiac,Hession,Oliver,luuillu,雨翔&a…