浅拷贝和深拷贝(shallow copy VS deep copy )

68-Skill企业资产管理工具实战:从部署到批量分配完整指南 企业资产管理是数字化转型中的基础环节,其核心原理是通过信息化手段对资产全生命周期进行追踪管理。在技术实现上,通常采用数据库存储资产信息,结合权限控制和业务流程引擎,实现资产登记、分配、盘点等标准化操作。这种系统化的管理方式能够显著提升资产利用率,降低管理成本,避免传统Excel表格管理容易出现的重复记录和数据不一致问题。在实际应用场景中,特别适合中小企业进行IT设备分配、固定资产盘点等需求。本文介绍的68-Skill资产管理工具正是基于这一理念开发的实战解决方案,重点演示了资产批量导入、状态追踪和权限管理等 阅读详情

浅拷贝和深拷贝(shallow copy VS deep copy )

引言

       C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解。 本文重点讨论引用类型变量的拷贝机制和实现。

       C#中引用类型对象的copy操作有两种:
  • 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段,对象的引用类型,仍属于原来的引用.
  • 深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的.

    浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。
    注意:string类型有点特殊,对于浅拷贝,类值类型对象进行处理。

浅拷贝的实现

  1. 使用Object类MemberwiseClone实现
    MemberwiseClone:创建当前 Object 的浅表副本。
    MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

    代码实现如下:

      public   class  Person
        {
            
    public   int  Age {  get ;  set ; }
            
    public   string  Address {  get ;  set ; }
            
    public  Name Name {  get ;  set ; }

            
    public   object  Clone()
            {
               
    return     this .MemberwiseClone();    
            }

            
        }


        
    public   class  Name
        {
            
    public  Name( string  frisName, string  lastName)
            {
                FristName 
    =  frisName;
                LastName 
    =  lastName;
            }
            
    public   string  FristName {  get ;  set ; }
            
    public   string  LastName {  get ;  set ; }
        }
  2. 赋值操作(=)VS使用Object类MemberwiseClone实现
    对于引用类型的变量,我们有种误解,认为赋值操作就是浅拷贝一种,其实不然,两者有区别。
    1. 浅拷贝(shallow copy)对于引用类型对象中的值类型字段进行了逐位复制。赋值运算符只是把源对象的引用赋值给目的对象,两者引用同一个对象。
    2. 浅拷贝后的对象的值类型字段更改不会反映到源对象,而赋值运算后的对象的值类型字段更改会反映到源对象

    代码实现如下:

         public   class  Person
        {
            
    public   int  Age {  get ;  set ; }
            
    public   string  Address {  get ;  set ; }
            
    public  Name Name {  get ;  set ; }
        }


        
    public   class  Name
        {
            
    public  Name( string  frisName, string  lastName)
            {
                FristName 
    =  frisName;
                LastName 
    =  lastName;
            }
            
    public   string  FristName {  get ;  set ; }
            
    public   string  LastName {  get ;  set ; }
        }

深拷贝实现

      相对于浅拷贝,是指依照源对象为原型,创建一个新对象,将当前对象的所有字段进行执行逐位复制并支持递归,不管是是值类型还是引用类型,不管是静态字段还是非静态字段。
      在C#中,我们们有三种方法实现深拷贝
  1. 实现ICloneable接口,自定义拷贝功能。
    ICloneable 接口,支持克隆,即用与现有实例相同的值创建类的新实例。
    ICloneable 接口包含一个成员 Clone,它用于支持除 MemberwiseClone 所提供的克隆之外的克隆。Clone 既可作为深层副本实现,也可作为浅表副本实现。在深层副本中,所有的对象都是重复的;而在浅表副本中,只有顶级对象是重复的,并且顶级以下的对象包含引 用。 结果克隆必须与原始实例具有相同的类型或是原始实例的兼容类型。

    代码实现如下:


      public   class  Person:ICloneable
        {
            
    public   int  Age {  get ;  set ; }
            
    public   string  Address {  get ;  set ; }
            
    public  Name Name {  get ;  set ; }

            
    public   object  Clone()
            {
                Person tem 
    =   new  Person();
                tem.Address 
    =   this .Address;
                tem.Age 
    =   this .Age;

                tem.Name 
    =   new  Name( this .Name.FristName,  this .Name.LastName);

                
    return  tem;
            }
        }


        
    public   class  Name
        {
            
    public  Name( string  frisName,  string  lastName)
            {
                FristName 
    =  frisName;
                LastName 
    =  lastName;
            }
            
    public   string  FristName {  get ;  set ; }
            
    public   string  LastName {  get ;  set ; }
        }

    大家可以看到,Person类继承了接口ICloneable并手动实现了其Clone方法,这是个简单的类,试想一下,如果你的类有成千上万个引用类型成员(当然太夸张,几十个还是有的),这是不是份很恐怖的劳力活?

  2. 序列化/反序列化类实现
    不知道你有没有注意到DataSet对象,对于他提供的两个方法:
    DataSet.Clone 方法,复制 DataSet 的结构,包括所有 DataTable 架构、关系和约束。不要复制任何数据。
    新 DataSet,其架构与当前 DataSet 的架构相同,但是不包含任何数据。注意 如果已创建这些类的子类,则复本也将属于相同的子类。
    DataSet.Copy 方法复制该 DataSet 的结构和数据.
    新的 DataSet,具有与该 DataSet 相同的结构(表架构、关系和约束)和数据。注意如果已创建这些类的子类,则副本也将属于相同的子类。

    好像既不是浅拷贝,又不是深拷贝,是不是很失望?但是两个结合起来不是我们要的深拷贝吗?看看DataSet的实现,注意序列化接口:ISerializable

    序列化是将对象或对象图形转换为线性字节序列,以存储或传输到另一个位置的过程。反序列化是接受存储的信息并利用它重新创建对象的过程。
    通过 ISerializable 接口,类可以执行其自己的序列化行为。
    转换为线性字节序列后并利用其重新创建对象的过程是不是和我们的深拷贝的语意“逐位复制”很相像?

    代码实现如下:

      [Serializable]
        
    public   class  Person : ICloneable
        {
            
    public   int  Age {  get ;  set ; }
            
    public   string  Address {  get ;  set ; }
            
    public  Name Name {  get ;  set ; }

            
    public   object  Clone()
            {
                
    using  (MemoryStream ms  =   new  MemoryStream( 1000 ))
                {
                    
    object  CloneObject;

                    BinaryFormatter bf 
    =   new  BinaryFormatter( null ,  new  StreamingContext(StreamingContextStates.Clone));
                    bf.Serialize(ms, 
    this );

                    ms.Seek(
    0 , SeekOrigin.Begin);

                    
    //  反序列化至另一个对象(即创建了一个原对象的深表副本)
                    CloneObject  =  bf.Deserialize(ms);

                    
    //  关闭流 
                    ms.Close();
                    
    return  CloneObject;
                }
            }
        }


        [Serializable]
        
    public   class  Name
        {
            
    public  Name( string  frisName,  string  lastName)
            {
                FristName 
    =  frisName;
                LastName 
    =  lastName;
            }
            
    public   string  FristName {  get ;  set ; }
            
    public   string  LastName {  get ;  set ; }
        }

    }
     

    注意:通过序列化和反序列化实现深拷贝,其和其字段类型必须标记为可序列化类型,既添加特性(Attribute)[Serializable]。

  3. 通过反射实现
    通 过序列化/反序列化方式我们能比较流畅的实现深拷贝,但是涉及到IO操作,托管的的环境中,IO操作比较消耗资源。 能不能有更优雅的解决方案。CreateInstance,对,利用反射特性。这个方法大家可以参考这篇博客:http://rubenhak.com /?p=70 文章反射类的Attribute,利用Activator.CreateInstance New一个类出来(有点像DataSet.Clone先获得架构),然后利用PropertyInfo的SetValue和GetValue方法,遍历的 方式进行值填充。

    代码实现如下:

    public   class  Person
    {
        
    private  List < Person >  _friends  =   new  List < Person > ();

        
    public   string  Firstname {  get ;  set ; }
        
    public   string  Lastname {  get ;  set ; }

        [Cloneable(CloneableState.Exclude)]
        [Cloneable(CloneableState.Include, 
    " Friends " )]
        
    public  List < Person >  Friends {  get  {  return  _friends; } }

        [Cloneable(CloneableState.Exclude)]
        
    public  PersonManager Manager {  get ;  set ; }
    }

     

C#为什么要设计深拷贝和浅拷贝?

这个我也一直也找不到一个合适的答案,希望有人来讨论下!

声明: 本文作者:宗哥,宗子城
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明。 .

from:http://www.tzwhx.com/newOperate/Html/1/12/121/18610.html

python的深拷贝(deep copy)和浅拷贝(shallow copy)?opencv的copy是深拷贝还是浅拷贝? 拷贝:只拷贝对象的「表层结构」,深层嵌套的可变对象仍共享引用,修改会互相影响;深拷贝:拷贝对象的「所有层级」,生成完全独立的新对象,修改副本不会影响原对象;直接赋值不是拷贝,只是引用传递,两个变量指向同一个对象。OpenCV-Python 中 img.copy()(或 cv2.copyTo(img, None))是深拷贝,拷贝后的图像与原图像完全独立,修改副本不会影响原图像;直接赋值(img_ref = img)不是拷贝,只是引用传递,修改引用对象会同步改变原图像; 阅读详情

相关推荐

浅拷贝和深拷贝深入理解(shallow copy VS deep copy)

浅拷贝和深拷贝深入理解(shallow copy VS deep copy) 本文重点讨论引用类型变量的拷贝机制和实现

浅拷贝(shallow copy)和深拷贝(deep copy)

浅拷贝(shallow copy):只负责克隆按值传递的数据(比如基本数据类型、String类型) 深拷贝(deep copy):除了shallowcopy的值外,还负责克隆引用类型的数据,基本是就是被克隆实例所有的属性数据都会被克隆出来。 这里推荐一篇介绍非常详细的外文文章 Difference Between Shallow Copy Vs Deep Copy In Java 什么是...

Guilai1990的博客 3883

R语言灰色关联分析法

输入数据并用DT包的datatable函数展示数据 ABDDEF分别对应第1到第6个供应商产品质量、技术水平、供应能力、经济效益、交货情况、市场影响度指标属于效益型指 产品价格、地理位置、售后服务指标属于成本型指标。现分别对上述指标进行规范化: 对于效益型指标(正项指标)标准化公式为: x∗=x−min(x)max(x)−min(x) x^{\ast}=\frac{x-min\left( x \right)}{max\left( x \right) -min\left( x \right)} x∗=max

qq_54423921的博客 7996

iOS-深拷贝和浅拷贝

一、深拷贝(Deep Copy) 和浅拷贝(Shallow Copy) 浅拷贝:指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝

MinggeQingchun的博客 2848

Zabbix-01简单导入MIB文件并测试

这里写自定义目录标题安装 MIB文件启用MIB文件测试MIB文件 MIB文件 MIB代表管理信息库。 MIB文件允许您使用OID(对象标识符)的文本表示。 ##例如: ifHCOutOctets 是OID【1.3.6.1.2.1.31.1.1.1.10】的文本表示 安装 MIB文件 在基于Debian的系统上: # apt install snmp-mibs-downloader # download-mibs 在基于RedHat的系统上: # yum install net-snmp-libs 启用M

lokibaba的博客 9179

基于STM32、HAL库的 CH9102X USB转UART收发器 驱动程序设计

/ 或 UART_HWCONTROL_RTS_CTS。// 其他函数实现类似,使用HAL_UART_Transmit_IT, HAL_UART_Receive_IT等。UART_TXD <---> USARTx_RX (STM32接收)UART_RXD <---> USARTx_TX (STM32发送)* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。

corlin6688的博客 506

C#学习笔记(十):阴影和深度复制

从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂。因为一个对象可能包含许多对象的引用,例如字段、成员等,这将涉及许多烦人的处理操作。把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型。 按照成员复制简单的对象可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法,...

weixin_34203426的博客 182

SAP BW/4HANA 项目字段级数据血缘分析的方法与工具

利用SAP自带工具可以在一定程度上查看数据流和字段使用情况,但往往需要人工逐步深挖。适用于简单场景或验证单个字段的映射。借助SAP数据治理解决方案(如 Information Steward、Data Intelligence 等)能够自动整合元数据,提供图形化、跨系统的血缘分析,适合对数据 lineage 有严格要求的企业级项目。第三方工具则提供了灵活强大的功能,如自动文档、生成功能丰富的报告,对于复杂环境下的血缘分析和影响分析非常有帮助。自行开发SQL/CDS脚本。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 471

ICloneable和IComparable

对于所有面向对象的语言,复制永远是一个容易引发讨论的题目,C#中也不例外。此类问题在面试中极其容易被问到,我们应该在了解浅拷贝和深拷贝基本概念的基础上,从设计的角度进一步考虑如何支持对象的拷贝。

kalvin_y_liu的博客 897

luks-磁盘加密工具

linux磁盘加密配置工具及步骤详解

zdd56789的博客 120

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

c# 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)

在C#中,拷贝对象有两种方式:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。理解这两种拷贝的区别对于管理对象和避免在程序中意外地共享或复制数据至关重要。

qq_41942413的博客 1007

零基础学GPU KMD--8. 内存管理:GPU 显存与系统内存的协同​8.1 显存分配策略:GEM / TTM 原理

支持 VRAM、GTT(Graphics Translation Table)、SYSTEM 内存的动态迁移与缓存管理。:若缓冲区在 SYSTEM,TTM 分配 GTT 条目并建立页表映射,使 GPU 可直接访问。:系统内存中预留给 GPU 直接访问的区域,通过 GPU 的 MMU 做地址翻译。你需要我继续展开这一部分吗?​ 为复杂离散 GPU 设计,应对大容量 VRAM、多内存域、显存迁移等问题。:重量级、功能全,适合大容量、多内存域的离散 GPU,强调显存迁移与统一管理。

amy_mhd的博客 185

浅拷贝(Shallow Copy) VS 深拷贝(Deep Copy)

首先,深拷贝和浅拷贝针对的是对象类型(对象,数组,函数) 浅拷贝指的是只是拷贝了对象的引用地址,彼此之间高耦合,一个改变,另一个可能也随之改变; 深拷贝是指只是完整的将变量的值拷贝过来,是一个新的对象,和被拷贝对象解耦合,一个改变,不会影响其它的内容。 浅拷贝 1.最浅的拷贝--对象直接赋值,整个地址拷贝 let a = { age: 1 } let b = a; a...

weixin_34143774的博客 152

YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 718

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

shallow copy and deep copy (浅拷贝 vs 深拷贝)

a.浅拷贝(Shallow Copy):只复制对象的基本类型,对象类型,仍属于原来的引用。  b.深拷贝(Deep Copy):不仅复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。 也就是说,shallow copy 只会拷贝原值,对于指针指向的内存空间,也仅仅拷贝其地址。而deep copy不仅拷贝原值,对于指针指向的内存空间,也做嵌套复制。 The default cop

MiTKooK's Tech Log 831

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python deepcopy 优化_Python Shallow Copy VS. Deep Copy (Python浅拷贝和深拷贝)

今天电面遇到Python中浅拷贝和深拷贝的区别,平时不经常用当然不知道了,回来就补个课。先举个非常常见的例子:importcopylist1=[1,2,3,['a','b']]list2=list1list3=copy.copy(list1)list4=copy.deepcopy(list1)list1.append(5)list1[3].append('c')print...

weixin_39769039的博客 125

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# Tips-浅拷贝和深拷贝(shallow copy VS deep copy )

引言 C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解。 本文重点讨论引用类型变量的拷贝机制和实现。 C#中引用类型对象的copy操作有两种: 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段...

weixin_30696427的博客 134

Java 浅拷贝和深拷贝的理解和实现方式

https://www.cnblogs.com/shakinghead/p/7651502.html https://blog.youkuaiyun.com/huwentao_totti/article/details/82755217 Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。举例说明:比如,对象A和对象B都属于类S,具有属...

NRGAGA的专栏 364

浅说深拷贝(Deep Copy)与浅拷贝(Shallow Copy)

浅拷贝(如 Object.assign()、展开运算符 ... )只复制对象的第一层属性,若属性为引用类型(如对象、数组),则复制的是引用而非实际数据,修改时会互相影响。 深拷贝(如 JSON.parse(JSON.stringify())、Lodash 的 _.cloneDeep())会递归复制所有层级,生成完全独立的新对象,修改互不影响。

weixin_65635437的博客 950

Deep copy(深拷贝)和shallow copy(浅拷贝)的区别

deep copy 和shallow copy 都是用于对象之间的拷贝,简单来说,如果

ForLearning 1万+

图文代码浅谈Python中Shallow Copy(浅拷贝)和Deep Copy(深拷贝)的区别

前言 以前大概了解过一下<深浅拷贝>的区别,不过没有太深入了解,写这篇文章是因为在学习PyTorch时想搞懂view的含义,而view似乎是跟 浅拷贝(Shallow Copy) 有关的,所以就想先搞懂浅拷贝与 深拷贝(Deep Copy) 的区别先。 这篇文章是根据Python内置的copy模块的官方说明,以及一些在Stack Overflow上的解释,加上自己的一些理解,画图并总结...

风筝大晒的博客 1665
上一篇: c#线程同步中的lock,monitor,同步事件和等待句柄以及mutex的介绍
下一篇: ASP.NET生成静态页面的方法
加油馒头
博客等级 码龄20年 289粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值