讲师中心 微信公众号
AI工具推荐 视频效率加速

c#如何实现浅拷贝_c#浅拷贝新手必看入门教程

风杰姑娘_1564

风杰姑娘_1564

发布时间:2026-04-04 14:14:06

|

757人浏览过

|

来源于php中文网

原创

浅拷贝仅复制引用而非对象本身,C#中唯一内置方式是MemberwiseClone(),它对值类型复制新值、引用类型只复制地址,导致子对象共享;需谨慎用于DTO映射、UI编辑副本等场景。

c#如何实现浅拷贝_c#浅拷贝新手必看入门教程

浅拷贝就是复制引用,不是复制对象本身

在 C# 里,MemberwiseClone() 是唯一内置的浅拷贝方式,它只复制字段值:值类型字段被复制一份新值,引用类型字段只复制引用地址——新旧对象指向同一个子对象。这意味着改 objB.Name 可能意外影响 objA.Name,如果 Name 是一个可变的 StringBuilder 或自定义类实例。

常见错误现象:objB.DataList.Add(item) 后,objA.DataList.Count 也变了;调试时发现两个对象的 Id 相同但 IsDirty 状态不一致,却始终同步变化。

  • 只对 class(且非 sealed)有效,struct 不支持 MemberwiseClone()
  • 必须是 public 或 protected 方法调用,不能在外部直接对任意对象调用
  • 不会触发任何构造函数或 ICloneable.Clone() 实现,纯内存位拷贝

怎么安全地用 MemberwiseClone

别裸用。必须显式实现 ICloneable 或自定义 Clone() 方法,并在内部调用 MemberwiseClone(),否则语义不清、IDE 警告多,且别人无法直觉判断这是浅拷还是深拷。

使用场景:DTO 映射前临时隔离状态、UI 层快速生成编辑副本、单元测试中构造相似但独立的测试对象。

  • 类必须声明为 public class MyClass,不能是 internal 或 private 嵌套类(否则 MemberwiseClone() 报 MethodAccessException)
  • 若含 readonly 字段,MemberwiseClone() 仍会复制其值,但后续无法通过属性修改——这点常被忽略
  • 返回类型建议写具体类型而非 object,避免强制转换和类型丢失
public class Person : ICloneable
{
    public string Name { get; set; }
    public List<string> Hobbies { get; set; } // 引用类型 → 共享同一 List
<pre class="brush:php;toolbar:false;">public Person Clone() => (Person)MemberwiseClone();

}

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

浅拷贝 vs new + 手动赋值,选哪个

手动 new + 赋值看起来啰嗦,但控制力强:你可以决定哪些字段要“真正复制”,哪些就该共享,哪些要特殊处理(比如跳过缓存字段、重置时间戳)。而 MemberwiseClone() 是全量字段无差别复制,容易把不该拷的也拷了。

性能上,MemberwiseClone() 略快(底层是内存块复制),但差异微乎其微,别为这点省略可维护性。

  • 含事件委托字段?MemberwiseClone() 会复制委托链,可能引发重复触发或内存泄漏
  • 有 IDisposable 成员?浅拷后两个对象共用一个资源,Dispose() 调一次就废
  • 字段是 string?安全,因为 string 不可变,共享没问题

为什么别用 BinaryFormatter 做浅拷贝

BinaryFormatter 本质是序列化,它默认做的是“深度图拷贝”(deep graph clone),不是浅拷。即使对象图里只有引用,它也会递归序列化整个引用链——这既慢又危险(.NET 5+ 已标记为 obsolete,反序列化有严重安全风险)。

有人误以为加 [NonSerialized] 就能模拟浅拷,但实际行为不可控:未标记字段仍可能因间接引用被拉入序列化范围,而且它完全绕过了类型安全性与构造逻辑。

  • 在 .NET Core / .NET 5+ 中,BinaryFormatter 默认禁用,启用需额外配置且不推荐
  • 哪怕降级到 .NET Framework,只要类含任何不可序列化成员(如 Thread、DbContext),就会抛 SerializationException
  • 真正的浅拷贝不该依赖序列化机制——那是深拷贝的思路

浅拷贝的关键不在“怎么写那一行代码”,而在“你是否清楚每个字段的生命周期和所有权”。一不留神,共享的引用就成了并发修改的雷区,或者 GC 时悬空引用的源头。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

1132

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

3331

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

945

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2655

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

352

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

429

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

631

2026.03.11

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

329

2026.04.13

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn