当前位置: 首页
编程语言
NET深拷贝实现方法与详细步骤解析

NET深拷贝实现方法与详细步骤解析

热心网友 时间:2026-05-07
转载

在 .NET 中实现深拷贝(Deep Copy)有几种常用方法

咱们先明确一下概念:深拷贝要做的,可不是简单地复制一个引用指针。它意味着创建一个全新的对象,并且像“开枝散叶”一样,递归地复制原对象及其内部所有引用对象的值。这和浅拷贝只复制“表面”有着本质区别。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

1. 使用序列化/反序列化

这招算是“经典流派”了,通过把对象序列化成二进制流,再反序列化回来,自然就得到了一个全新的副本。但有个前提,你的相关类型都得是可序列化的。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public static class ObjectCopier
{
    public static T DeepCopy(T obj)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", nameof(obj));
        }
        if (ReferenceEquals(obj, null))
        {
            return default;
        }
        IFormatter formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, obj);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

2. 使用 JSON 序列化(Newtonsoft.Json 或 System.Text.Json)

随着JSON的普及,这方法现在用得越来越多了。它本质上是把对象“翻译”成JSON文本,然后再“翻译”回来,实现拷贝。两种主流库都可以用,选择哪个看你的项目环境。

// 使用 Newtonsoft.Json
using Newtonsoft.Json;

public static T DeepCopy(T obj)
{
    var json = JsonConvert.SerializeObject(obj);
    return JsonConvert.DeserializeObject(json);
}

// 使用 System.Text.Json (推荐.NET Core 3.0+)
using System.Text.Json;

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

3. 实现 ICloneable 接口(手动实现)

如果你需要更精细的控制,或者对象结构特殊,手动实现ICloneable接口是个可靠的选择。这种方式需要你亲自动手,为每个引用类型成员安排“克隆”工作,灵活性最高。

public class MyClass : ICloneable
{
    public int Value { get; set; }
    public MyOtherClass Other { get; set; }

    public object Clone()
    {
        var copy = (MyClass)MemberwiseClone(); // 先来个浅拷贝
        copy.Other = (MyOtherClass)Other.Clone(); // 再手动深拷贝引用成员
        return copy;
    }
}

public class MyOtherClass : ICloneable
{
    public string Name { get; set; }
    public object Clone()
    {
        return MemberwiseClone(); // 如果成员都是值类型,浅拷贝就够了
    }
}

4. 使用 AutoMapper(适用于复杂对象)

当面对属性众多、层次复杂的对象图时,配置一次AutoMapper,之后就可以优雅地一键深拷贝了。它特别适合在项目已经引入该库,或者对象结构非常规整的场景。

using AutoMapper;

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap();
    cfg.CreateMap();
});
var mapper = config.CreateMapper();
var copy = mapper.Map(original);

5. 注意事项

方法虽多,但各有利弊,选择时别忘了下面这些潜在的“坑”:

  • 可序列化是门槛:序列化方法要求所有相关类都得是可序列化的(要么标记[Serializable]特性,要么能被JSON序列化器处理)。
  • 小心循环引用:如果对象内部存在A引用B,B又引用A这样的情况,很容易导致堆栈溢出或者序列化直接报错。
  • 性能有差异:对于大型、嵌套很深的对象图,序列化/反序列化的开销不容忽视,可能会成为性能瓶颈。
  • 特殊类型需处理:像委托、事件、COM对象这些特殊成员,上述通用方法很可能无法正确拷贝,需要额外处理。

6. 推荐方法

说了这么多,到底该怎么选?这里有个简单的决策思路:

  • 对于简单对象或临时拷贝:直接用JSON序列化(特别是System.Text.Json,在.NET Core环境下性能表现更佳)。
  • 对于结构清晰的复杂对象图:考虑配置AutoMapper或者老老实实实现ICloneable接口,以获得更好的可控性。
  • 对于性能极其敏感的场景:没有银弹,手动实现深拷贝逻辑通常是最终方案,虽然开发成本高,但性能最优。

总而言之,没有绝对最好的方法,只有最适合当前场景的选择。综合考量你的具体需求、对象结构的复杂程度以及对性能的要求,才能做出最合适的决定。

来源:https://www.jb51.net/aspnet/339555a22.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Java输出方法详解:控制台日志与文件写入全解析

Java输出方法详解:控制台日志与文件写入全解析

排查问题或了解运行环境时,使用System getProperty()方法可快速获取JVM和操作系统的关键信息。代码能输出Java版本、安装目录、类路径、操作系统详情及文件分隔符等属性。这些信息有助于排查类路径问题、判断环境兼容性、构建跨平台路径,并为日志调试提供重要上下文,是诊断环境问题的实用工具。

时间:2026-05-07 15:34
Ubuntu系统下使用Go语言实现机器学习的实践指南

Ubuntu系统下使用Go语言实现机器学习的实践指南

在Ubuntu上使用Go进行机器学习需先安装环境并配置工作空间,通过goget获取golearn等库。编写代码遵循数据加载、模型训练、预测评估的流程后运行程序。Go在性能与并发方面有优势,但生态不如Python丰富,更适合特定工程场景或统一技术栈的团队探索。

时间:2026-05-07 13:59
Ubuntu系统下Go语言程序打包方法与核心要点

Ubuntu系统下Go语言程序打包方法与核心要点

在Ubuntu中打包Go应用需关注环境配置、交叉编译与优化。通过GoModules管理依赖,使用CGO_ENABLED=0生成静态二进制文件以实现跨平台兼容。利用UPX和链接器参数减小体积,采用Docker多阶段构建制作最小镜像。交付时建议包含平台信息并签名,注意解决动态库依赖和版本锁定等常见问题。

时间:2026-05-07 13:58
Android开发中高效管理多个CheckBox组件的实用技巧

Android开发中高效管理多个CheckBox组件的实用技巧

在Android应用开发过程中,高效管理多个功能相似的复选框(CheckBox)是提升开发效率的关键。无论是应用设置界面、多选列表,还是动态生成的选项列表,如果对每个CheckBox都进行单独引用和操作,代码会迅速变得冗长且难以维护。那么,是否存在更优雅的解决方案?答案是肯定的——通过数组或动态集合

时间:2026-05-07 13:58
面向对象编程中封装字段如何提升代码安全性与维护性

面向对象编程中封装字段如何提升代码安全性与维护性

将类的公共字段改为私有,并提供公共的获取和设置方法,是提升代码安全性与可控性的基础重构。此举能防止外部随意读写,避免状态失控,并便于后续加入校验、脱敏等控制逻辑,适用于核心业务或敏感字段。

时间:2026-05-07 13:58
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程