首页 > 编程语言 >C#中的对象深拷贝和浅拷贝

C#中的对象深拷贝和浅拷贝

时间:2024-05-11 14:22:10浏览次数:22  
标签:Person C# person2 对象 person1 Address 拷贝 public

1. 浅拷贝

public class Person
{
    public Person()
    {
        this.Address = new Address();
    }
    public string Name { get; set; }
     public int Age { get; set; }
    public Address Address { get; set; }

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

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

  

2. 深拷贝

深拷贝是指不仅拷贝对象的值类型成员,而且还拷贝所有引用类型成员的实际对象。这意味着新的对象将拥有其引用类型成员的完全独立副本。

实现方式

  • 反射
  • 序列化
  • 对象映射(三方开源如TinyMapper、AutoMapper)。
/// <summary>
/// 深拷贝
/// </summary>
public static void Copy2()
{
    Person person1 = new Person()
    {
        Name = "张三",
        Address = new Address()
        {
            City = "北京",
        }
    };

    //Person person2 = CreateDeepCopy(person1);//深拷贝1反射
    // Person person2 =JsonConvert.DeserializeObject<Person>(JsonConvert.SerializeObject(person1));//深拷贝2序列化
    Person person2 =person1.MapTo<Person,Person>();//深拷贝3对象映射
    //修改原对象的属性
    person1.Address.City = "上海";
    //修改副本对象的属性
    person2.Name = "李四";
    person2.Address.City = "昆明";
    string result = $"原对象{JsonConvert.SerializeObject(person1)}。副本{JsonConvert.SerializeObject(person2)}";
    MessageBox.Show($"深拷贝:原对象和副本不相互影响。{result}");
}


/// <summary>
/// 使用反射进行深拷贝
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="original"></param>
/// <returns></returns>
static T CreateDeepCopy<T>(T original)
{
    if (original == null)
    {
        return default(T);
    }

    Type type = original.GetType();
    object newObject = Activator.CreateInstance(type);

    foreach (FieldInfo fieldInfo in type.GetFields())
    {
        if (fieldInfo.IsStatic)
        {
            continue;
        }

        object value = fieldInfo.GetValue(original);
        fieldInfo.SetValue(newObject, CreateDeepCopy(value));
    }

    return (T)newObject;
}

  

标签:Person,C#,person2,对象,person1,Address,拷贝,public
From: https://www.cnblogs.com/friend/p/18186405

相关文章

  • linux环境静态编译openssl、curl
    编译opensslopenssl下载地址:https://www.openssl.org/source/index.htmltarzxvfopenssl-3.3.0.tar.gzcdopenssl-3.3.0/./config-fPICno-shared--prefix=/root/openssl_install--openssldir=/root/openssl_installmakemakeinstall编译curlcurl下载地址:https:/......
  • 669. 修剪二叉搜索树(leetcode)
    https://leetcode.cn/problems/trim-a-binary-search-tree/description/要点是区分在区间左边还是右边,在区间左边那么右子树也还有必要去查找删除,右边同理,返回的是删除后新树的根节点要注意函数要实现单层逻辑和完成闭环语义classSolution{//查找要删除的节点,进行......
  • DSP学习笔记之IIC
    IIC简介IIC总线是同步通信的一种特殊形式,是一种串行,半双工的通信,I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。IIC分为硬件IIC和软件IIC,DSP中有硬件IIC,但是不方便拓展,所以日常使用时使用软件IIC居多。IIC总线通信过程主机发送起始信号启用总线主机发送......
  • MacOS 上 Flutter 3.19.6 修改 maven 的源
    将Flutter中的maven访问源修改为国内镜像源。因为目前网站多数教程已经不适用了,找了很久才找到替换方法,故特此记录。本篇方法参考了此链接。下面是修改的方法:(1)打开Flutter的安装目录/packages/flutter_tools/lib/src/http_host_validator.dart文件 (2)将maven的访......
  • SCI拒稿重投
     回复审稿意见常见问题及注意事项如果你是reject & resubmit的话,你就要按照对待大修的标准再高一点修改你的论文,这要求你对每个审稿人的每条意见都要照顾到。以我以往在本领域期刊投稿和审稿的经验,顶刊第一轮给reject & resubmit是很常见的,这个有利于期刊本身的数据。不然最......
  • Component Tester - 超迷你的元器件测试仪
    1、cJSON-一款基于C语言的轻量级JSON解析库JSON是一种轻量级的数据交换格式,可以把JSON的结构理解成无序的、可嵌套的key-value键值对集合,这些key-value键值对以结构体或数组的形式来组织的。cJSON是C语言写的一个JSON解析库。项目主页: https://github.com/DaveGamble/cJSON......
  • CentOS上搭建SFTP
    CentOS上搭建SFTP 在CentOS上安装SFTP服务通常是通过安装OpenSSH来实现的,因为OpenSSH默认提供了SFTP功能。以下是在CentOS上安装SFTP的步骤: 一、安装OpenSSH服务器:sudoyuminstallopenssh-server启动SSH服务:sudosystemctlstartsshd确保SSH服务随系统启动而启动:sud......
  • 虚拟机安装 centos静态IP配置
    虚拟机安装centos后,配置静态ipcd/etc/sysconfig/network-scriptssudovimifcfg-enp0s8编辑配置文件OXY_METHOD=noneBROWSER_ONLY=noB00TPROTO=dhcpDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV......
  • CentOs上安装minio
    MINIO安装一、下载二进制文件wgethttps://dl.minio.org.cn/server/minio/release/linux-amd64/minio 二、授权,并移动到指定目录chmod+xminiosudomvminio/usr/local/bin/ 二、创建服务文件/usr/lib/systemd/system/minio.service 内容如下: [Unit]Descripti......
  • microLite - 极简可靠的嵌入式裸机系统软件平台
    1、树莓派推出首款微控制器级产品PiPico树莓派基金会近日推出了首款微控制器级产品树莓派PiPico(RaspberryPiPico),这款产品的售价仅为4美元。资讯主页: https://www.raspberrypi.org/blog/raspberry-pi-silicon-pico-now-on-sale/树莓派PiPico是一款基于树莓派自己设计......