值拷贝

定义:直接复制变量的值,适用于基本数据类型(如int, float, char等)。在 C# 中,值类型(基本数据类型和结构体)默认使用值拷贝。

特点:创建原始值的完全独立副本,修改副本不会影响原始值

示例

int a = 10;
int b = a; // 值拷贝
b = 20;    // 修改b不会影响a

打印:

引用拷贝

 定义:复制对象的引用(内存地址),不创建新对象。对于引用类型(类、接口、委托、数组等),赋值操作默认是引用拷贝。

特点:新变量和原变量指向同一个对象,修改其中任一对象都会影响另一个

示例

class Person { public string Name; }
var person1 = new Person() { Name = "小明" };
var person2 = person1;person2.Name = "小红";

打印:

浅拷贝

定义:创建一个新的对象。如果数据是基本类型,拷贝的就是基本类型的值;如果数据是引用类型,则拷贝的就是内存地址即引用。

特点

1、修改克隆对象中的基本类型数据不会影响原对象的基本类型数据。

2、修改克隆对象中的引用类型数据会影响原对象的值类型数据,本质上,两者的引用类型数据是同一个。

示例

class Person : ICloneable
{public string Name;public int Id;public Address Address; // 引用类型字段public object Clone(){return this.MemberwiseClone(); // 浅拷贝}
}class Address { public string Street; }//--------------------------------------------------------Person person1 = new Person { Name = "Alice", Id = 666,Address = new Address { Street = "北京" }
};Person person2 = (Person)person1.Clone();//浅拷贝person2.Name = "Bob"; 
person2.Id = 123;
person2.Address.Street = "上海"; // 会影响p1的Address

打印:

深拷贝

 定义:完全复制原始对象及其所有嵌套对象,创建一个独立的,全新的对象,在深拷贝中,原始对象与新对象之间没有任何共享的引用

特点:修改克隆对象中的基本类型数据或者引用类型数据都不会影响原对象的数据,它们是完全独立的。

示例

class Person : ICloneable
{public string Name;public int Id;public Address Address; // 引用类型字段public object Clone(){Person cloned = (Person)this.MemberwiseClone();cloned.Address = new Address { Street = this.Address.Street }; // 深拷贝引用类型字段return cloned;}
}class Address { public string Street; }//--------------------------------------------------------Person person1 = new Person { Name = "Alice", Id = 666,Address = new Address { Street = "北京" }
};Person person2 = (Person)person1.Clone();//深拷贝person2.Name = "Bob"; 
person2.Id = 123;
person2.Address.Street = "上海"; 

打印:

总结

拷贝类型

实现方法

特点

适用场景

性能

值拷贝

直接赋值

创建完全独立副本

值类型(int, float, struct等)

引用拷贝

直接赋值

共享同一对象引用

引用类型(class)的简单传递

浅拷贝

MemberwiseClone

复制值类型字段,共享引用类型字段

对象结构简单或引用字段无需独立

中等

深拷贝

手动实现/序列化

完全独立的对象图

复杂对象需要完全独立副本

较低

知识补充

对复杂对象使用序列化实现深拷贝

本示例使用Newtonsoft实现,也可以使用其他的序列化方法实现

using Newtonsoft.Json;
class Person : ICloneable
{public string Name;public int Id;public Address Address; // 引用类型字段public object Clone(){string json = JsonConvert.SerializeObject(this);return JsonConvert.DeserializeObject<Person>(json);}
}class Address { public string Street; }
特性序列化方法普通手动方法
实现复杂度简单,一行代码处理整个对象图复杂,需要为每个引用类型字段手动实现
维护成本低,对象结构变化不影响拷贝逻辑高,对象结构变化需同步修改拷贝方法
性能较低(涉及序列化/反序列化开销)较高(直接内存操作)
循环引用处理自动处理需手动处理,否则会栈溢出
私有字段拷贝可以拷贝私有字段只能拷贝可访问字段

处理集合类对象的拷贝

浅拷贝

1. 使用构造函数浅拷贝
class Person
{public string Name;public int Id;
}List<Person> originalList = new List<Person> { new Person
{Name = "Alice" ,Id = 111} };List<Person> shallowCopy = new List<Person>(originalList); // 浅拷贝// 修改新集合中的元素会影响原集合
shallowCopy[0].Name = "Bob";
2. 使用 LINQ 的 ToList()/ToArray()实现浅拷贝
class Person
{public string Name;public int Id;
}List<Person> originalList = new List<Person> { new Person
{Name = "Alice" ,Id = 111} };List<Person> shallowCopy = originalList.ToList();// 浅拷贝// 修改新集合中的元素会影响原集合
shallowCopy[0].Name = "Bob";

深拷贝

手动实现

先在Person类中实现深拷贝方法

class Person : ICloneable
{public string Name;public int Id;public Address Address; // 引用类型字段public object Clone(){string json = JsonConvert.SerializeObject(this);return JsonConvert.DeserializeObject<Person>(json);}
}List<Person> originalList = new List<Person> { new Person{Name = "Alice" ,Id = 111} };List<Person> deepCopy = new List<Person>();
foreach (var data in originalList)
{deepCopy.Add((Person)data.Clone());
}deepCopy[0].Name = "Bob";
使用 LINQ + 元素拷贝
 List<Person> deepCopy = originalList.Select(p => (Person)p.Clone()).ToList();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90399.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90399.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90399.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习图像分类数据集—百种鸟类识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;525种鸟类识别分类 训练数据集总共有84635张图片&#xff0c;每个文件夹…

零基础 “入坑” Java--- 八、类和对象(一)

文章目录一、初识面向对象二、类的定义和使用1.认识类2.类的定义格式三、类的实例化四、this引用五、对象的构造及初始化1.有关初始化2.构造方法3.就地初始化一、初识面向对象 Java是一门纯面向对象的语言&#xff08;OOP&#xff09;&#xff0c;在面向对象的世界里&#xff…

数字孪生技术引领UI前端设计新篇章:智能物联网的深度集成

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;数字孪生与物联网的共生革命在智能设备爆发式增长的今天&#xff0c;传统…

代码审计-shiro漏洞分析

一、关于shiro介绍 简单讲&#xff0c;shiro是apache旗下的一个Java安全框架&#xff0c;轻量级简单易上手&#xff0c;框架提供很多功能接口&#xff0c;常见的身份认证 、权限认证、会话管理、Remember 记住功能、加密等等。 二、漏洞分析 1.CVE-2019-12422-shiro550 漏洞原理…

EF提高性能(查询禁用追踪)(关闭延迟加载)

EF默认是支持延迟加载的&#xff0c;在加载一个表的数据时&#xff0c;会把关联表的数据一并加载&#xff0c;这样会影响性能。 一般建议关闭延迟加载可以提高EF加载的性能。还有其他方法提高性能&#xff08;查询禁用追踪&#xff09; 如果要实现延迟加载&#xff0c;必须满足…

Leetcode+JAVA+贪心III

134.加油站在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。给定两个整数数组 gas 和 …

Qt信号与槽机制及动态调用

Qt信号与槽机制及动态调用一、信号与槽1、Qt信号与槽机制概述2、信号与槽的基本使用3、信号与槽的特性4、使用Lambda表达式作为槽5、信号与槽的参数传递6、注意事项二、动态调用机制1、基本用法2、示例代码3、带参数的调用4、返回值处理5、信号与槽的动态连接6、动态方法调用7、…

K8s系列之:Kubernetes 的 OLM

K8s系列之:Kubernetes 的 OLM 什么是 Kubernetes 的 OLM什么是Kubernetes中的OperatorOLM 的功能OLM 的核心组件OLM优势OLM 的工作原理OLM 与 OperatorHub 的关系OLM示例场景什么是CRDoperator 和 CRD的关系为什么需要 CRD 和 OperatorCRD定义资源类型DebeziumServer如何使用d…

前端-HTML-day2

目录 1、无序列表 2、有序列表 3、定义列表 4、表格-基本使用 5、表格-结构标签 6、表格-合并单元格 7、表单-input基本使用 8、表单-input占位文本 9、表单-单选框 10、表单-上传多个文件 11、表单-多选框 12、表单-下拉菜单 13、表单-文本域 14、表单-label标签…

两种方式清除已经保存的git账号密码

方式一随便选择一个文件夹&#xff0c;然后鼠标右键-》TortoiseGit ->设置选择已保存的数据-》认证数据-》清除-》点击确定方式二 控制面板\用户帐户\凭据管理器-》windows凭据普通凭据-》找到git信息-》选择删除

Using Spring for Apache Pulsar:Message Production

1. Pulsar Template在Pulsar生产者端&#xff0c;Spring Boot自动配置提供了一个用于发布记录的PulsarTemplate。该模板实现了一个名为PulsarOperations的接口&#xff0c;并提供了通过其合约发布记录的方法。这些send API方法有两类&#xff1a;send和sendAsync。send方法通过…

CSS揭秘:10.平行四边形

前置知识&#xff1a;基本的css变形一、平行四边形 要实现一个平行四边形&#xff0c;可以使用CSS的skew变形属性来倾斜元素。 transform: skewX(-45deg);图-1显示容器和内容都出现了倾斜&#xff0c;该如何解决这个问题&#xff1f; 二、嵌套方案 我们通过将内容嵌套 div 并使…

深度学习 必然用到的 线性代数知识

把标量到张量、点积到范数全串起来&#xff0c;帮你从 0 → 1 搭建 AI 数学底座 &#x1f680; 1 标量&#xff1a;深度学习的最小单元 标量 就是一维空间里的“点”&#xff0c;只有大小没有方向。例如温度 52 F、学习率 0.001。 记号&#xff1a;普通小写 x&#xff1b;域&am…

OpenGL ES 纹理以及纹理的映射

文章目录开启纹理创建纹理绑定纹理生成纹理纹理坐标图像配置线性插值重复效果限制拉伸完整代码在 Android OpenGL ES 中使用纹理&#xff08;Texture&#xff09;可以显著提升图形渲染的质量和效率。以下是使用纹理的主要好处&#xff1a; 增强视觉真实感 纹理可以将复杂的图像…

从金字塔到个性化路径:AI 正在重新定义学习方式

几十年来&#xff0c;我们的教育系统始终遵循着一条熟悉的路线&#xff1a; 从小学、初中、高中&#xff0c;再到大学和研究生。这条标准化的路径&#xff08;K-12 到研究所&#xff09;结构清晰&#xff0c;却也缓慢。但在当今这个信息爆炸、知识快速更新、个性化需求高涨的时…

产品经理岗位职责拆解

以下是产品经理岗位职责的详细分解表&#xff0c;涵盖工作内容、核心动作及输出成果&#xff1a;岗位职责具体工作内容输出成果1. 日常版本迭代管理需求分析及PRD产出协调资源推动产品上线- 收集业务/用户需求&#xff0c;分析可行性及优先级- 撰写PRD文档&#xff0c;明确功能…

后端微服务基础架构Spring Cloud

版本关系 版本发布说明-阿里云Spring Cloud Alibaba官网 选择 创建项目 创建父项目 什么都不动&#xff0c;创建即可 1) 删掉没用的文件 保留 2) pom中加入 打包方式 <packaging>pom</packaging> 3) 删掉src 4) pom.xml中删除没用的 5)更改pom.xml中 spring…

数据分析框架和方法

一、核心分析框架 (The Big Picture Frameworks)​​描述性分析 (What Happened?)​​​​目的&#xff1a;​​ 了解过去发生了什么&#xff0c;描述现状&#xff0c;监控业务健康。​​核心工作&#xff1a;​​ 汇总、聚合、计算基础指标 (KPI)&#xff0c;生成报表和仪表盘…

电路研究9.3.10——合宙Air780EP中的AT开发指南:阿里云应用指南

这个好像也用不到&#xff0c;不过可以先贴出来。简单看了一下也没深入分析&#xff0c;直接扒过来了&#xff0c;感觉涉及到了上位机的学习了。我这下位机的可能用不到&#xff0c;就是贴过来好了。 应用概述 使用 AT 方式连接阿里云分为一机一密和一型一密&#xff0c;其中一…

[Backlog] 核心协调器 | 终端用户界面(TUI)实现 | 多分支任务冲突解决 | 测试验证体系

第8章 核心协调器 欢迎回到Backlog.md&#xff01; 在上一章文件系统操作中&#xff0c;我们深入了解了数据物理存储层面的读写机制。本章将聚焦系统的神经中枢——核心协调器。 核心协调器的本质&#xff08;中央决策引擎&#xff09; 如果将Backlog.md视为项目管理团队&a…