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

C#中的浅拷贝与深拷贝

浅拷贝与深拷贝的概念

浅拷贝(Shallow Copy)仅复制对象的顶层结构,若对象包含引用类型成员(如数组、类实例),则复制的是引用地址而非实际数据。拷贝后的对象与原对象共享引用成员。

深拷贝(Deep Copy)会递归复制对象的所有层级结构,包括引用类型成员的实际数据。拷贝后的对象与原对象完全独立,不共享任何引用。

实现方式

浅拷贝实现

在C#中,可通过MemberwiseClone方法实现浅拷贝:

public class MyClass
{public int Value;public List<string> Names;public MyClass ShallowCopy(){return (MyClass)this.MemberwiseClone();}
}

深拷贝实现

需手动递归复制所有引用类型成员:

public class MyClass : ICloneable
{public int Value;public List<string> Names;public object Clone(){var copy = new MyClass();copy.Value = this.Value;copy.Names = new List<string>(this.Names); // 创建新列表return copy;}
}

或通过序列化实现通用深拷贝:(弃用,BinaryFormatter不安全)

using System.Runtime.Serialization.Formatters.Binary;public static T DeepCopy<T>(T obj)
{using (var ms = new MemoryStream()){var formatter = new BinaryFormatter();formatter.Serialize(ms, obj);ms.Position = 0;return (T)formatter.Deserialize(ms);}
}

通过json序列化,反序列化实现:

function deepCopy(obj) {return JSON.parse(JSON.stringify(obj));
}

Unity中的典型应用场景

浅拷贝适用场景
  • 需要快速复制组件配置但允许共享部分引用数据时(如多个NPC共享同一行为树引用)。
  • 复制Transform等轻量级Unity对象,其内部引用由引擎管理。
深拷贝适用场景
  • 复制可序列化的ScriptableObject资产,避免修改原资产。
  • 需要独立副本的游戏对象实例化(如预制体深层次状态复制)。
  • 网络同步时传输完全独立的对象状态数据。

性能与注意事项

  • 浅拷贝性能开销低,适合高频调用的简单对象复制。
  • 深拷贝对复杂对象可能引发性能问题,需避免每帧调用。
  • Unity中部分原生类型(如Texture、Material)需特殊处理,不能直接序列化深拷贝。
  • 使用[System.NonSerialized]标记不需要深拷贝的字段。

示例:Unity中的深拷贝组件

using UnityEngine;
using System;[Serializable]
public class CharacterStats : ICloneable
{public float health;public float[] resistances; // 数组需深拷贝public object Clone(){var copy = new CharacterStats();copy.health = this.health;copy.resistances = (float[])this.resistances.Clone();return copy;}
}public class Enemy : MonoBehaviour
{public CharacterStats stats;public Enemy CreateClone(){var newEnemy = Instantiate(this);newEnemy.stats = (CharacterStats)stats.Clone();return newEnemy;}
}


文章转载自:

http://yXte2C0l.khntd.cn
http://oBt3vNnw.khntd.cn
http://tyz2ThID.khntd.cn
http://klimpdOk.khntd.cn
http://JsEOFRPG.khntd.cn
http://6D31xkiP.khntd.cn
http://l9E7JDKS.khntd.cn
http://0spqdQYj.khntd.cn
http://VEaDUIG3.khntd.cn
http://qxfzznQU.khntd.cn
http://4Wnmve9s.khntd.cn
http://PSJWXshr.khntd.cn
http://bBZd46kM.khntd.cn
http://wNFGKxGM.khntd.cn
http://ROatoOpT.khntd.cn
http://g7CHqZYo.khntd.cn
http://ZWwm7z1h.khntd.cn
http://FYJEHQK2.khntd.cn
http://x4KIsOcq.khntd.cn
http://gT3tvFgI.khntd.cn
http://lmZTWim0.khntd.cn
http://WZ5QxbBr.khntd.cn
http://htSXvFB7.khntd.cn
http://BIylfqCJ.khntd.cn
http://xTE89e2Q.khntd.cn
http://jDwScDK0.khntd.cn
http://nHexzd5h.khntd.cn
http://HbvhBGNt.khntd.cn
http://krGhOxoG.khntd.cn
http://n45s500h.khntd.cn
http://www.dtcms.com/a/375068.html

相关文章:

  • docker 整理几个常用的指令
  • Git上有更新而本地无更新时的解决方案
  • Doc2X为一切AI文档服务的基础设施,将PDF转换为Word、HTML、LaTeX、Markdown等
  • k8s 内置的containerd配置阿里云个人镜像地址及认证
  • 新节点加入k8s集群命令查看
  • 在 PostgreSQL中查看有哪些用户
  • 【从零开始的大模型原理与实践教程】--第一章:NLP基础概念
  • 零侵入式对接美团核销接口的技术合作模式
  • Kafka面试精讲 Day 14:集群扩容与数据迁移
  • 解耦-IOCDI
  • 【秋招笔试】2025.09.07蚂蚁算法岗笔试题
  • 10月17日,博睿数据受邀出席GOPS 全球运维大会 2025 · 上海站!
  • 第三方软件测评机构:MongoDB分片集群写入吞吐量与延迟第三方性能测评
  • 【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
  • 【56页PPT】数字孪生智能工厂总体结构技术架构MES+ERP建设方案(附下载方式)
  • type(类型别名)和 interface的区别和最佳实践
  • 【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
  • 4 C 语言数据结构实战:栈和队列完整实现(结构体 + 函数)+ 最小栈解决方案
  • day2 java 基础语法
  • Elasticsearch:智能搜索的 MCP
  • 数据结构与算法-树和二叉树-二叉树的存储结构(Binary Tree)
  • OpenCV 图像金字塔
  • 2025年渗透测试面试题总结-61(题目+回答)
  • 传统项目管理和流程管理区别
  • Blender来设计一个机器宠物-完整的3D建模流程
  • TI-92 Plus计算器:矩阵计算功能介绍
  • 中电金信:AI重构测试体系·智能化时代的软件工程新范式
  • qt QAreaSeries详解
  • 强化学习笔记(二)多臂老虎机(一)
  • 设计模式--装饰器模式