全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#怎么实现深拷贝和浅拷贝 C#对象克隆方法

C#中浅拷贝仅复制值类型字段和引用类型地址,深拷贝则递归复制所有嵌套对象;常用方式包括MemberwiseClone(浅拷贝)、JsonSerializer序列化(通用深拷贝)、ICloneable手动实现(精细控制)及表达式树(高性能)。

在C#中,浅拷贝只复制对象的值类型字段和引用类型的地址(即新旧对象共享同一引用对象),深拷贝则递归复制所有嵌套对象,确保新对象与原对象完全独立。关键区别在于引用类型是否被真正“复制”。

用MemberwiseClone实现浅拷贝

MemberwiseClone() 是Object类提供的受保护方法,它创建当前对象的浅表副本:值类型字段被逐位复制,引用类型字段只复制引用(指针),不复制所指向的对象本身。

  • 必须在类内部调用(因为是protected)
  • 适用于字段均为值类型、或明确接受引用共享的场景
  • 无法直接用于public克隆接口,需封装为public方法

示例:

class Person { public string Name; public Address Addr; public Person ShallowCopy() => (Person)MemberwiseClone(); }

用序列化实现通用深拷贝

借助二进制或JSON序列化+反序列化,可绕过手动递归逻辑,自动完成完整对象图的深拷贝。这是最常用、兼容性较好的方案(前提是类型可序列化)。

  • BinaryFormatter已过时且不安全,推荐用System.Text.JsonNewtonsoft.Json
  • 需确保所有嵌套类型标记为[Serializable](JSON方式通常只需public属性)
  • 注意循环引用、不可序列化成员(如事件、委托、FileStream等)会报错

示例(JsonSerializer):

public static T DeepCopy(T obj) { var json = JsonSerializer.Serialize(obj); return JsonSerializer.Deserialize(json); }

实现ICloneable并手动编写深拷贝逻辑

对性能敏感或结构复杂(含不可序列化资源)的类型,可实现ICloneable接口,重写Clone()方法,显式new每个引用字段并调用其Clone()。

  • 完全可控,适合精细管理资源生命周期
  • 维护成本高:新增字段需同步更新Clone逻辑
  • 建议返回具体类型(而非object),避免强制转换

示例:

public class Person : ICloneable { public string Name; public Address Addr; public object Clone() => new Person { Name = this.Name, Addr = (Address)this.Addr.Clone() }; }

用表达式树或反射生成深拷贝器(高级)

第三方库如FastDeepClonerDeepCloner或自定义表达式编译器,能在首次调用后缓存委托,大幅提升后续拷贝性能。

  • 适合高频深拷贝且对象结构稳定的场景(如游戏帧数据、配置快照)
  • 避免每次反射开销,但首次构建有延迟
  • 需注意泛型类型支持、只读属性、构造函数参数等边界情况

基本上就这些。选哪种方式,取决于你的对象是否可序列化、性能要求高低、以及是否愿意承担维护成本。日常开发中,JsonSerializer深拷贝够用又安全;核心模块需要极致性能,再考虑表达式树方案。


# js  # json  # stream  # 区别  # c#  # Static  # String  # Object  # 封装  # 构造函数  # 递归  # 循环  # 指针  # 接口  # class  # 值类型  # 引用类型  # public  # protected  # FileStream  # 委托  # 泛型  # var  # 对象  # 事件  # this  # 序列化  # 首次  # 这是  # 只需  # 均为  # 适用于  # 能在  # 较好  # 自定义 


相关文章: 深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  南宁网站建设制作定制,南宁网站建设可以定制吗?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  TestNG的testng.xml配置文件怎么写  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  建站主机如何安装配置?新手必看操作指南  孙琪峥织梦建站教程如何优化数据库安全?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  c# 在高并发场景下,委托和接口调用的性能对比  微信小程序制作网站有哪些,微信小程序需要做网站吗?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  SQL查询语句优化的实用方法总结  如何设置并定期更换建站之星安全管理员密码?  建站之星免费版是否永久可用?  已有域名能否直接搭建网站?  Bpmn 2.0的XML文件怎么画流程图  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何快速搭建二级域名独立网站?  建站主机CVM配置优化、SEO策略与性能提升指南  建站之星安装模板失败:服务器环境不兼容?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Android滚轮选择时间控件使用详解  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何快速生成橙子建站落地页链接?  如何零基础在云服务器搭建WordPress站点?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  南京网站制作费用,南京远驱官方网站?  如何快速搭建高效香港服务器网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  制作网站的模板软件,网站怎么建设?  建站之星客服服务时间及联系方式如何?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  如何在企业微信快速生成手机电脑官网?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何用花生壳三步快速搭建专属网站?  如何选择高效响应式自助建站源码系统?  动图在线制作网站有哪些,滑动动图图集怎么做?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何在Golang中使用replace替换模块_指定本地或远程路径  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何快速搭建高效WAP手机网站吸引移动用户?  如何续费美橙建站之星域名及服务?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站之星安装路径如何正确选择及配置?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。