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

c#中赋值、浅拷贝和深拷贝

在 C# 编程中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用于复制对象的两种不同方式,它们在处理对象时有着重要的区别和适用场景。

浅拷贝(Shallow Copy)

浅拷贝是指创建一个新对象,然后将当前对象的非静态字段复制到新对象中。如果字段是值类型,则复制字段的值;如果字段是引用类型,则复制引用,因此两个对象将引用同一个实例。换句话说,浅拷贝只复制对象本身和对象中的值类型字段,而不会复制引用类型字段所引用的对象。

在 C# 中,可以使用对象的 MemberwiseClone() 方法来实现浅拷贝,或者通过赋值操作来进行简单的浅拷贝。

public class MyClass
{public int MyValue;public SomeClass MyReference;public MyClass ShallowCopy(){return (MyClass)this.MemberwiseClone();}
}

深拷贝(Deep Copy)

深拷贝是创建一个新对象,然后递归地复制当前对象及其所有引用的对象,直到所有对象都被复制。这样,即使原始对象和新对象引用的是相同类型的对象,它们也是彼此独立的,对一个对象的修改不会影响到另一个对象。

在 C# 中,实现深拷贝通常需要手动编写代码来递归复制对象的所有引用类型字段。这可以通过序列化和反序列化对象来实现,或者通过自定义复制方法递归地复制对象及其引用类型字段。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;[Serializable]
public class MyClass
{public int MyValue;public SomeClass MyReference;public MyClass DeepCopy(){using (MemoryStream stream = new MemoryStream()){BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(stream, this);stream.Seek(0, SeekOrigin.Begin);return (MyClass)formatter.Deserialize(stream);}}
}

使用时的注意事项

  1. 引用类型的处理:浅拷贝复制的是引用,深拷贝则会递归地复制引用类型的对象。因此,如果对象中包含引用类型字段,可能需要实现深拷贝以确保复制的完整性和独立性。

  2. 性能考虑:深拷贝可能涉及到递归复制较大的对象图,可能比浅拷贝耗费更多的时间和内存。

  3. 可变性:浅拷贝的对象共享同一个引用类型的实例,因此一个对象的修改可能会影响到另一个对象。深拷贝则可以确保对象的完全独立性,修改一个对象不会影响到另一个。

  4. 序列化的使用:在实现深拷贝时,序列化是一种通用的方法,但需要注意确保所有需要复制的对象及其引用类型字段都是可序列化的。

赋值、浅拷贝和深拷贝之间的关系时,需要明确它们之间的区别:

  • 赋值(Assignment):简单地将一个对象的引用赋给另一个对象,两者指向同一块内存地址。因此,对一个对象的修改也会影响到另一个对象。

  • 浅拷贝(Shallow Copy):创建一个新对象,并将原始对象中的字段值复制到新对象中。如果字段是值类型,则直接复制其值;如果字段是引用类型,则复制其引用,两个对象将指向同一块内存地址。

  • 深拷贝(Deep Copy):创建一个新对象,并递归地复制原始对象以及它所有引用的对象,生成一份完全独立的拷贝,两个对象之间没有任何关联。

下面通过示例来说明这三者之间的关系:

using System;public class DemoClass
{public int Value;public InnerClass Reference;public DemoClass(int value, InnerClass reference){this.Value = value;this.Reference = reference;}
}public class InnerClass
{public int InnerValue;public InnerClass(int innerValue){this.InnerValue = innerValue;}
}public class Main
{public static void Main(){InnerClass inner = new InnerClass(100);DemoClass original = new DemoClass(50, inner);// 赋值DemoClass shallowCopy = original;DemoClass deepCopy = original.DeepCopy();Console.WriteLine("Original Reference: " + original.Reference.InnerValue);// 修改原始对象中引用对象的值inner.InnerValue = 200;// 赋值情况下,两个对象会共享同一个引用类型对象Console.WriteLine("Shallow Copy Reference: " + shallowCopy.Reference.InnerValue);// 深拷贝后,两个对象引用完全独立的对象,修改一个不影响另一个Console.WriteLine("Deep Copy Reference: " + deepCopy.Reference.InnerValue);}
}

在上面的示例中,DemoClass 包含一个值类型字段 Value 和一个引用类型字段 ReferenceInnerClass 是被引用的类。在 Main 类中,我们创建了一个原始对象 original,然后通过赋值进行浅拷贝和通过自定义的深拷贝方法进行深拷贝。

在后续的操作中,修改了原始对象中引用对象的值,通过打印浅拷贝和深拷贝中引用对象的值,可以看到浅拷贝共享同一个引用对象,而深拷贝是独立的。

http://www.lryc.cn/news/389766.html

相关文章:

  • 旧版st7789屏幕模块 没有CS引脚的天坑 已解决!!!
  • 激光粒度分析仪校准步骤详解:提升测量精度的秘诀
  • 独一无二的设计模式——单例模式(python实现)
  • 第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!
  • 原型模式的实现
  • 【第二套】华为 2024 年校招-硬件电源岗
  • Xilinx FPGA:vivado利用单端RAM/串口传输数据实现自定义私有协议
  • Spark on k8s 源码解析执行流程
  • 粤港联动,北斗高质量国际化发展的重要机遇
  • Chrome导出cookie的实战教程
  • 视频文字转语音经验笔记
  • 视频融合共享平台LntonCVS统一视频接入平台智慧安防应用方案
  • 使用Python绘制动态螺旋线:旋转动画效果
  • Symfony实战手册:PHP框架的高级应用技巧
  • TOGAF培训什么内容?参加TOGAF培训有什么好处?考试通过率多少?
  • keepalived HA nginx方案
  • 报错:pathspec ‘xxx‘ did not match any file(s) known to git
  • sed 保持空间命令之 x 的执行逻辑
  • 按位异或^
  • 《企业实战分享 · 常用运维中间件》
  • PyCharm 2024.1简介
  • 终身免费的Navicat数据库,不需要破解,官方支持
  • Spring Boot中的模板引擎选择与配置
  • 4、音视频封装格式---FLV
  • vscode 前行复制到下一行
  • 什么是文档透明加密|好用的文档透明加密软件有哪些?
  • XTDrone-固定翼无人机编队跟踪无人车-配置教程
  • 实现高性能、可扩展的实时数据采集系统:go-zero的应用与实践
  • AUTOSAR NvM模块(五)
  • 输出feign调用详细日志