C#深度拷贝

C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。【浅拷贝就是表面上拷贝了地址;深拷贝就是拷贝了内容 】 对于值类型变量,copy是属于全盘复制; 而对于引用类型变量,一般的copy只是浅copy,相当于只传递一个引用指针一样。 因此对于引用类型变量进行真正copy的时候,也是最费事的。


浅拷贝 只是复制本身,它包含的对象只是复制引用,其中包含的对象就直接拿来用了,这样产生的问题就是:如果一个被修改了,另一个也跟着变。是这样的,但是除了string类型外,string类型,本来属于引用类型,因此在进行复制的时候,采用的是浅拷贝,但当发生变化的时候,系统会自动生成进行深copy。 对象的字段如果是值类型,那么无论是浅拷贝还是深拷贝都是原样复制。 深拷贝 不仅要复制本身,还要复制他所包含对象。对象的字段如果是引用类型,那么浅拷贝是复制引用,深拷贝是复制引用的对象。


通俗的讲:别人想要你们家的房子,你把钥匙给他了,那叫浅拷贝;你给他盖了一个一模一样的,那叫深拷贝;Hashtable和ArrayList等经常需要深度拷贝,而.Net没有现成的函数可以调用,我从国网站找了一个方法

public object Clone(){BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));MemoryStream stream = new MemoryStream();Formatter.Serialize(stream, this);stream.Position = 0;object clonedObj = Formatter.Deserialize(stream);stream.Close();return clonedObj;}

继承了Clonable接口之后,像这样重写Clone()方法就可以了,他利用了序列化和反序列化的原理,将序列化的流丢入内存,再从内存中反序列化回来就OK了!

posted @   小麻雀  阅读(5812)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示