【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://xiahunao.cn/news/2660420.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

硅像素传感器文献调研(四)

写在前面&#xff1a; 好喜欢这种短论文哈哈哈哈哈 感觉这篇文献已经提到了保护环的概念啊&#xff0c;只不过叫的是&#xff1a;场限制环。 1986——高压功率器件场终端横向掺杂的变化 0.摘要 对于高压平面结提出了一个简单的新概念。通过在氧化物掩模中的小开口和随后的驱…

响应式绑定<a-textarea>的内容

项目中的 <a-textarea>组件需要自动填入下方数据表的物品名称数量单位&#xff0c;效果如下&#xff1a; 尝试 <a-textarea>{{插值}}</a-textarea>&#xff0c;实现不了&#xff0c;问ai得知需要使用v-decorator 指令的initialValue 属性 问&#xff1a; 如何…

自己动手写编译器:算术表达式的语法分析实例和代码实现

在编译原理中&#xff0c;语法解析可能是最抽象和难以理解的部分&#xff0c;初学者很容易在这里卡壳。学习抽象知识的最好方法就是在初期先看大量具体实例&#xff0c;获得足够深厚的感性认识后&#xff0c;我们再对感性认知进行推理和抽象从而获得更高级的理性认知&#xff0…

VMware之FTP的简介以及搭建使用计算机端口的介绍

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、FTP介绍 1、什么是FTP&#xff1a; 2、FTP适用于以下情况和应用场景&#xff1a; 3、winServer2012搭…

最长连续子序列 - 华为OD统一考试

OD统一考试(B卷) 分值: 100分 题解: Java / Python / C++ 题目描述 有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度, 如果没有满足要求的序列,返回-1。 输入描述 第一行输入是:N个正整数组成的一个序列。…

VBA启动问题:vbe6ext.olb不能被加载

1、拷贝文件&#xff1a; 从&#xff1a; C:\Program Files\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB 到&#xff1a; C:\Program Files\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA7.1\VBE…

虹科方案丨L2进阶L3,数据采集如何助力自动驾驶

来源&#xff1a;康谋自动驾驶 虹科方案丨L2进阶L3&#xff0c;数据采集如何助力自动驾驶 原文链接&#xff1a;https://mp.weixin.qq.com/s/qhWy11x_-b5VmBt86r4OdQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 12月14日&#xff0c;宝马集团宣布&#xff0c;搭载…

【2024最新版】我用python代码带你看最绚烂的烟花,浪漫永不过时!

2024年就快要到了&#xff0c;提前用python代码给自己做一个烟花秀庆祝一下。本次介绍的python实例是实现一个简易的烟花秀。 一、步骤分析 总的来说&#xff0c;要实现烟花秀的效果&#xff0c;需要以下几个步骤&#xff1a; 1.1、创建一个类&#xff0c;包含烟花各项粒子的…

解决 Nginx 反向代理中的 DNS 解析问题:从挑战到突破20231228

引言 在使用 Nginx 作为反向代理服务器时&#xff0c;我们可能会遇到各种配置和网络问题。最近&#xff0c;我遇到了一个有趣的挑战&#xff1a;Nginx 在反向代理配置中无法解析特定的域名&#xff0c;导致 502 错误。这个问题的解决过程不仅揭示了 Nginx 的一个不太为人知的功…

力扣刷题记录(20)LeetCode:198、213、337

198. 打家劫舍 我们从第一个开始分析&#xff1a; dp[i]:i表示索引&#xff0c;dp表示当前索引可以拿到的最高金额 索引为0时&#xff0c;可以拿到的最高金额为1&#xff1b; 索引为1时&#xff0c;可以拿到的最高金额就是在索引[0,1]之间取&#xff0c;为2 索引为2时&…

[华为诺亚实验室+中科大提出TinySAM | 比SAM小10倍,精度的超车!]

文章目录 概要整体架构流程Related Work技术细节小结 概要 最近&#xff0c;Segment Anything Model (SAM) 已经展示出了强大的分割能力&#xff0c;在计算机视觉领域引起了广泛关注。基于预训练的 SAM 的大量研究工作已经开发了各种应用&#xff0c;并在下游视觉任务上取得了令…

leaflet学习笔记-自定义Icon(四)

前言 leaflet的marker可以使用icon&#xff0c;所以这篇文章我们自定义一个icon&#xff0c;并在marker中使用&#xff0c;满足我的恶趣味 实例化Icon 首先准备一个你喜欢的图片&#xff0c;并将它添加到你的项目中&#xff0c;这里我找了一张本人的卡通图片 icon实例化代码&…

121. 买卖股票的最佳时机(Java)

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

二分查找及其复杂的计算

&#xff08;一&#xff09;二分查找及其实现 二分查找&#xff0c;也称为折半查找&#xff0c;是一种高效的搜索算法&#xff0c;用于在有序数组&#xff08;或有序列表&#xff09;中查找特定元素的位置。 二分查找的基本思想是将待查找的区间不断地二分&#xff0c;然后确…

静态HTTP:为什么它如此重要

静态HTTP是互联网上使用最广泛的数据传输协议之一&#xff0c;它在Web应用程序中扮演着至关重要的角色。本文将探讨静态HTTP的重要性及其在Web开发中的应用。 一、静态HTTP的定义和优势 静态HTTP是指服务器上预先生成好的静态文件&#xff0c;这些文件包含HTML、CSS、JavaScr…

erp是什么意思啊?erp系统中有哪些模块?

对于在企业管理领域深耕的人来说&#xff0c;erp这个名字一定不陌生&#xff0c;甚至可以说是他们日常工作中必不可少的重要伙伴。那么&#xff0c;erp究竟是什么意思&#xff1f;erp系统中包含着哪些模块&#xff1f;又是如何协助企业日常运作的呢&#xff1f;今天就让我们一起…

Boot Camp分区备份还原工具boot Camp迁移助手---Winclone pro 10

Winclone Pro 10是一款专为Mac用户设计的先进Windows系统备份和迁移工具。它提供了强大而易于使用的功能&#xff0c;让用户能够轻松地创建、克隆和还原Windows系统&#xff0c;并在Mac上运行。以下是Winclone Pro 10的主要功能和特点&#xff1a; 完整的系统备份和还原&#…

【最新报道】初窥Windows AI 工作室

自我介绍 做一个简单介绍&#xff0c;酒研年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Vue - Class和Style绑定详解

1. 模板部分 <template><div><!-- Class 绑定示例 --><div :class"{ active: isActive, text-danger: hasError }">Hello, Vue!</div><!-- Class 绑定数组示例 --><div :class"[activeClass, errorClass]">Cla…

大数据Doris(四十三):创建物化视图

文章目录 创建物化视图 一、首先你需要有一个Base表