【C#】深拷贝和浅拷贝

文章目录

  • 深拷贝和浅拷贝的定义
    • 深拷贝(Deep Copy)
    • 浅拷贝(Shallow Copy)

深拷贝和浅拷贝的定义

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在复制对象时涉及的两个不同概念

深拷贝(Deep Copy)

  • 定义: 深拷贝是一种复制对象的方法,它创建了一个新对象,并递归地复制原始对象及其所有嵌套的引用类型成员。这意味着在新对象中创建了原始对象及其所有相关对象的独立副本。
  • 特点: 修改一个对象的属性或其中的引用对象不会影响另一个对象。深拷贝通常需要考虑对象图中所有引用类型的复制。

在C#中,实现对象的完全拷贝可以通过实现ICloneable接口使用序列化和反序列化的方法来完成

实现ICloneable接口,需要自己实现Clone方法返回一个深拷贝对象,这边不做赘述。

下面使用通过将对象序列化到内存流,然后再反序列化为新的对象这种方式实现深拷贝。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;namespace frameWorkTest1.utils
{/// <summary>/// 深拷贝扩展方法/// </summary>public static class DeepCopyExtensions{public static T DeepCopy<T>(this T source){if (!typeof(T).IsSerializable){throw new ArgumentException("The type must be serializable.", nameof(source));}// Perform deep copy using serializationusing (MemoryStream memoryStream = new MemoryStream()){IFormatter formatter = new BinaryFormatter();formatter.Serialize(memoryStream, source);memoryStream.Seek(0, SeekOrigin.Begin);return (T)formatter.Deserialize(memoryStream);}}}
}

这边举个例子 User类的 有个类型为B的属性GetB

[Serializable]public class User{private string _userName;public string UserName{get { return _userName; }set { _userName = value; }}private int _age;public int Age{get { return _age; }set { _age = value; }}private B _b;public B GetB{get { return _b; }set { _b = value; }}/// <summary>/// 浅拷贝/// </summary>/// <returns></returns>public User ShallowCopy(){// 浅拷贝,使用Object受保护方法MemberwiseClonereturn (User) this.MemberwiseClone();}/// <summary>/// 深拷贝/// </summary>/// <returns></returns>public User DeepCopyS(){// 调用扩展方法进行深拷贝return this.DeepCopy();}}[Serializable]public class B{private int _Num;public int Num{get { return _Num; }set { _Num = value; }}}

使用深拷贝

User user = new User() { UserName = "小米",Age = 18,GetB = new B { Num = 255}
};
// 深拷贝
User user1 = user.DeepCopyS();
user1.GetB.Num = 188;
Console.WriteLine($"user:{user.GetB.Num},user1:{user1.GetB.Num}");

在这里插入图片描述

浅拷贝(Shallow Copy)

  • 定义: 浅拷贝是一种复制对象的方法,它创建了一个新对象,并复制原始对象及其所有值类型成员和引用类型成员的引用(而不是实际的对象)。这意味着新对象中的引用类型成员仍然指向与原始对象相同的对象。
  • 特点: 修改一个对象的属性或其中的引用对象可能会影响另一个对象,因为它们引用相同的对象实例。

总体而言,深拷贝创建了原始对象及其嵌套对象的独立副本,而浅拷贝创建了原始对象及其嵌套对象的引用副本。选择使用深拷贝还是浅拷贝取决于你的需求和数据结构的复杂性。在处理嵌套引用类型时,深拷贝通常更安全,但也可能更耗费资源。

在C#中浅拷贝可以直接使用Object受保护方法MemberwiseClone

参考上述深拷贝中的代码

public User ShallowCopy()
{// 浅拷贝,使用Object受保护方法MemberwiseClonereturn (User) this.MemberwiseClone();
}
User user2 = user.ShallowCopy();
user2.GetB.Num = 100;
Console.WriteLine($"user:{user.GetB.Num},user2:{user2.GetB.Num}");

在这里插入图片描述

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

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

相关文章

视频美颜SDK趋势畅想:未来发展方向与应用场景

当下&#xff0c;视频美颜SDK正不断演进&#xff0c;本文将深入探讨视频美颜SDK的发展趋势&#xff0c;探讨未来可能的方向和广泛的应用场景。 1.深度学习与视频美颜的融合 未来&#xff0c;我们可以期待看到更多基于深度学习算法的视频美颜SDK&#xff0c;为用户提供更高质量…

【数据结构】插入排序、选择排序、冒泡排序、希尔排序、堆排序

前言&#xff1a;生活中我们总是会碰到各种各样的排序&#xff0c;今天我们就对部分常用的排序进行总结和学习&#xff0c;今天的内容还是相对比较简单的一部分&#xff0c;各位一起加油哦&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f44…

Buck电源设计常见的一些问题(四)MOS管振荡抑制方法(二)

MOS管振荡抑制方法(二)RC snubber 缓冲电路的设计 1. Snubber 电路2.开关回路等效电路3. RC参数设计1. Snubber 电路 由于寄生参数的存在,开关电源电路在开关动作瞬间会产生开关振铃。图 1 为 buck 电路开关节点 (两个开关与电感交汇点)的典型波形,可见在上管开通瞬间都…

力扣算法-Day14

第202题. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

E : DS查找—二叉树平衡因子

Description 二叉树用数组存储&#xff0c;将二叉树的结点数据依次自上而下,自左至右存储到数组中&#xff0c;一般二叉树与完全二叉树对比&#xff0c;比完全二叉树缺少的结点在数组中用0来表示。 计算二叉树每个结点的平衡因子&#xff0c;并按后序遍历的顺序输出结点的平衡…

Vulnhub-Al-Web-1.0 靶机复现完整过程

一、信息收集 1.主机发现 arp-scan -l2.端口扫描 nmap -sV -p- 192.168.200.16PORTSTATESERVICEVERSIONMAC Address80/TCPOpenhttpApache httpd00:0C:29:C4:1B:78 (VMware) 3.目录扫描 python dirsearch.py -u http://192.168.200.16扫描出来这两个文件&#xff0c;首先先…

C++力扣题目150--逆波兰表达式求值

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

案例232:基于微信小程序的学生实习与就业管理系统设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

基于动态窗口的航线规划

MATLAB2016b可以运行 % ------------------------------------------------------------------------- % File : DWA 算法 % Discription : Mobile Robot Motion Planning with Dynamic Window Approach % Author :Yuncheng Jiang % License : Modified BSD Software License A…

C# WPF上位机开发(报表导出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于在工厂上班的小伙伴来说&#xff0c;导出生产数据、生成报表&#xff0c;这是很习以为常的一个工作。之前的文章中&#xff0c;虽然我们也介绍…

如何使用mac电脑,1、使用快捷命令打开访达,2、使用终端命令创建文件,3、使用命令打开创建的文件,并且在vscode中打开

如何使用mac电脑 1、使用快捷命令打开访达 optioncommand空格键 快速进入访达 shiftcmmandn 创建一个空目录 2、使用终端命令创建文件 2.1进入文件夹 在终端页面输入“cd /Users/yunf/Desktop/”并按回车键&#xff08;此时进入到桌面文件夹&#xff0c;如果需要进入到其它…

代码随想录二刷 | 二叉树 |二叉搜索树中的搜索

代码随想录二刷 &#xff5c; 二叉树 &#xff5c;二叉搜索树中的搜索 题目描述解题思路递归法迭代法 代码实现递归法迭代法 题目描述 700.二叉搜索树中的搜索 给定二叉搜索树&#xff08;BST&#xff09;的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回…

apisix admin api 403 Forbidden(接口请求403)

故事背景 当你通过admin api 接口方式执行相关操作时&#xff0c;例如route、upstream设置&#xff0c;接口返回403 Forbidden&#xff0c; 例如 请求 curl -i "http://192.168.100.1:9180/apisix/admin/routes" -H X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 -X…

【Gradio】1、Gradio 是什么

官网&#xff1a;https://www.gradio.app/ 一、Gradio 是什么 Gradio是一个用于创建机器学习模型交互式界面的 Python 库。通过Gradio&#xff0c;可以快速地为模型构建一个可视化的、易于使用的Web界面&#xff0c;无需编写任何Web前端代码。 Gradio 支持多种不同类型的输入…

从Java 8到Java 17:Spring Boot项目升级的终极指南

Java的世界一直在进步&#xff0c;随着Java 17的发布&#xff0c;众多开发者面临着将他们的Spring Boot应用从Java 8迁移到最新版本的任务。在这篇博客中&#xff0c;我将详细介绍如何平滑、高效地完成这一升级过程。从梳理可能的挑战到实际操作步骤&#xff0c;我将为你的升级…

win32 菜单编程学习1

新建一个Win32空工程; 添加一个main.cpp,添加一个窗口的win32代码; 运行,出来一个窗口,此时没有菜单; 然后在资源中插入菜单; 编辑菜单; 此时自动生成resource.h; 里面包含, #define IDR_MENU1 101 #define ID_TEST1_TEST101 …

嵌入式开发——ADC模拟信号和数字信号

模拟信号和数字信号 模拟信号 自然界中大多数物理量是连续变化的,比如温度、声音、压力等灯,它们在一定时间内,可以有无限多个不同的取值,这些信号就是模拟信号。模拟信号就是指用连续变化的物理量所表示的信号。 自然界中的物理量都需要通过传感器将其转换成电信号后,才能进…

桥接模式-举例

概叙&#xff1a;桥接模式用一种巧妙的方式处理多层继承存在的问题&#xff0c; 用抽象关联取代了传统的多层继承&#xff0c; 将类之间的静态继承关系转换为动态的对象组合关系&#xff0c; 使得系统更加灵活&#xff0c;并易于扩展&#xff0c; 同时有效控制了系统中类的个数…

Python武器库开发-武器库篇之Git创建远程仓库和建立SSH key 免密登陆(三十七)

武器库篇之Git创建远程仓库和建立SSH key 免密登陆(三十七) Git是一种版本控制系统&#xff0c;用于跟踪文件的更改和协调多人开发项目。它可以记录文件的历史更改&#xff0c;协助多人协作开发&#xff0c;并提供分支管理功能。Git是一个分布式系统&#xff0c;意味着每个人在…

听说!Art-DAQ实现了与LabVIEW的无缝连接

前言 阿尔泰科技与时俱进&#xff0c;推出Art-DAQ程序&#xff0c;与LabVIEW无缝连接&#xff0c;形成系统平台体系。持续不断地获取行业新技术&#xff0c;完善自主知识产权产品的研发&#xff0c;为客户提供优质服务。 什么是Labview&#xff1f; 从产品的角度来看&#x…