当前位置: 首页 > news >正文

C#如何解决引用类型的“深度”克隆问题

前言

在C#中我们new一个引用类型的对象称为对象1,如果我们再次new一个引用类型的对象称为对象2,如果直接将第一个对象直接赋值给第二个对象,然后如果我们这时候改变对象2的值,你会发现对象1的值也会被更改,这就是引用类型的浅克隆,因为引用类型的复制本质上并没有开辟新的内存,两个对象都是指向同一个内存,所以改变其中一个对象,另一个对象的值也会被改变。本文就来介绍如何让引用类型的对象复制以后各自拥有独立的内存从而实现一个对象值的变化不会影响别的对象。

1、C#的浅克隆举例

我们首先定义一个类称为TestClone,这个类有一个成员变量a。

 class  TestClone{public int a = 0;}

第一步、 然后我们new一个TestClone类的对象称为testClone1 ,然后将它的成员a赋值为10;
第二步、 接着我们再次new一个TestClone类的对象称为testClone2,然后将testClone1 赋值给testClone2;
第三步、更改testClone2的成员a的值为100。
最后、输出testClone1.a的值,值为100,我们会发现虽然我们没有直接给testClone1.a赋值,但是由于TestClone是一个引用类型,所以testClone1 和testClone2都是指向了同一个内存地址,所以我们更改testClone2的值,实际上也就是更改testClone1的值,这种对象的复制方式我们称为浅克隆。

   //浅克隆TestClone testClone1 = new TestClone();testClone1.a = 10;TestClone testClone2 = new TestClone();testClone2 = testClone1;testClone2.a = 100;Console.WriteLine(testClone1.a );//输出值为100

2、C#的深克隆举例

我们发现浅克隆看起来复制了多个对象,实际上值并没有被复制,所以这里我们介绍深克隆,深克隆的目的就是为同一个类的不同对象创建不同的内存,这样每个对象的值都是独立的,更改一个对象的值不会影响别的对象的值。
在下面的代码中我调用了一个第三方的类JsonConvert,这个类引用Newtonsoft.Json这个dll
在这里插入图片描述
第一步、首先new一个对象testClone3 ,并将它的成员a设置为10。
第二步、调用JsonConvert.SerializeObject方法将对象序列化一个字符串。
第三步、调用JsonConvert.DeserializeObject将字符串反序化为TestClone 类型的对象并赋值给testClone4
第四步、设置 testClone4.a = 100;
最后、输出testClone3.a的值,该值为10,你会发现testClone3的值并没有随着testClone4的值改变而改变,这样这两个对象就是具备独立的内存了,实现了深克隆。

  //深克隆TestClone testClone3 = new TestClone();testClone3.a = 10;TestClone testClone4= JsonConvert.DeserializeObject<TestClone> (JsonConvert.SerializeObject(testClone3));testClone4.a = 100;Console.WriteLine(testClone3.a);//输出值为10

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 细说MCU检测按键输入的外部中断和修改HAL_GPIO_EXTI_IRQHandler() 的实现方法
  • 贪吃蛇(使用QT)
  • 连接投影仪/显示器只能扩展不能复制的解决方案
  • 七夕警示:探索社工库与网络搜索下的个人隐私泄露与保护策略
  • 机器学习西瓜书笔记(五) 第五章神经网络+代码
  • Mybatis(Day 18)
  • 代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形
  • Less 教程:从入门到精通
  • Golang | Leetcode Golang题解之第329题矩阵中的最长递增路径
  • 如何有效构建企业微信私域流量池并提升用户粘性?
  • LinuxC++(10):调用可执行程序
  • 【实现100个unity特效之16】unity2022之前或者之后版本实现全屏shader graph的不同方式 —— 适用于人物受伤红屏或者一些其他状态效果
  • 2024年8月8日(python基础)
  • 开源应用:AI监测如何成为社会安全的智能盾牌
  • 【Week-G7】Semi-Supervised GAN 实践,使用MNIST数据集
  • CSS 三角实现
  • ESLint简单操作
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • jquery ajax学习笔记
  • JS学习笔记——闭包
  • Laravel 菜鸟晋级之路
  • Python3爬取英雄联盟英雄皮肤大图
  • win10下安装mysql5.7
  • 从零开始学习部署
  • 爬虫模拟登陆 SegmentFault
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • raise 与 raise ... from 的区别
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # SpringBoot 如何让指定的Bean先加载
  • #Linux(Source Insight安装及工程建立)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (20050108)又读《平凡的世界》
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (day18) leetcode 204.计数质数
  • (pytorch进阶之路)扩散概率模型
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /bin/rm: 参数列表过长"的解决办法
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [Android Pro] AndroidX重构和映射
  • [Angular] 笔记 21:@ViewChild
  • [AX]AX2012 R2 出差申请和支出报告
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波