首页 > 编程语言 >C#:.NET深拷贝和浅拷贝

C#:.NET深拷贝和浅拷贝

时间:2023-03-23 17:22:36浏览次数:26  
标签:C# 对象 using BinaryFormatter 拷贝 序列化 NET

.NET中的深拷贝和浅拷贝是指对象复制的方式。浅拷贝只复制对象的引用,而不复制对象本身,因此两个对象会共享同一个引用。深拷贝则是复制对象本身,而不是复制对象的引用,因此两个对象是完全独立的。

在.NET中,可以通过实现ICloneable接口来实现对象的浅拷贝。

ICloneable接口定义了一个Clone方法,该方法返回一个与当前对象相同的新对象。默认情况下,Clone方法执行的是浅拷贝。 

如果需要实现对象的深拷贝,可以使用序列化和反序列化的方式。例如,可以使用BinaryFormatter类将对象序列化为二进制数据,然后再使用MemoryStream和BinaryFormatter类将二进制数据反序列化为新的对象。这样可以实现对象的深拷贝。 

以下是一个示例代码,演示了如何使用序列化和反序列化的方式实现对象的深拷贝: 

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class Program
{
    static void Main(string[] args)
    {
        Person person1 = new Person { Name = "张三", Age = 18 };
        Person person2 = DeepClone(person1);
        Console.WriteLine(person1 == person2); // 输出 False
    }

    static T DeepClone<T>(T obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, obj);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

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

 

标签:C#,对象,using,BinaryFormatter,拷贝,序列化,NET
From: https://www.cnblogs.com/yellow3gold/p/17248208.html

相关文章

  • CentOS安装Mysql5
    title:CentOS安装Mysql5.7date:2022-08-1417:45:50tags:-Linux-CentOS-Mysqlcategories:-运维-数据库-Mysqlkeywords:'Linux,CentOS,Mysql'de......
  • net.netfilter.nf_conntrack_tcp_be_liberal
    参考链接:https://developer.aliyun.com/ask/336089当开启只有不在tcp窗口内的rst包被标志为无效,当关闭(默认)所有不在tcp窗口中的包都被标志为无效.0:关闭1:开启 ......
  • [ARC147E] Examination
    [ARC147E]Examination发现题解区和我做法都不一样,那就写一下吧。首先判合法很显然把\(A\)和\(B\)都排序后依次比较即可。首先转化成求最小的可以交换的集合。不难......
  • [重读经典论文] AlexNet笔记
    1.前言AlexNet是一个深度卷积神经网络模型,由AlexKrizhevsky、IlyaSutskever和GeoffreyHinton于2012年设计。这个模型在ImageNet图像识别挑战赛中获得了当时的冠军,并推......
  • Acrobat Pro DC2019 软件下载安装
    软件介绍:AdobeAcrobat是由Adobe公司开发的一款PDF(PortableDocumentFormat,便携式文档格式)编辑软件。借助它,您可以以PDF格式制作和保存你的文档,以便于浏览和打印,或使用......
  • 【ACM算法竞赛日常训练】DAY1题解与分析
    DAY1共四题:月月查华华的手机:https://ac.nowcoder.com/acm/problem/23053RinneLovesEdges:https://ac.nowcoder.com/acm/problem/22598逆序对:https://ac.nowcoder.com......
  • python 之 click 包,设置命令行参数
    原文链接:PythonClick学习笔记 Click 是Flask的团队pallets开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现。恰好我最近在......
  • DELL服务器iDRAC 8 无法启动虚拟控制台,提示"另存为",“viewerjnlp”
    说明:最近刚搞了两台DELL的服务器,iDRAC8的版本是Enterprise,点击启动虚拟控制台网页让我下载文件。因为我平时很少用到iDRAC,以前使用的iDRAC也都是供应商配置好了的,所以这......
  • CSAPP-Shell Lab
    提供的工具:parseline:获取参数列表char**argv,返回是否为后台运行命令(true)。clearjob:清除job结构。initjobs:初始化jobs链表。maxjid:返回jobs链表中最大的jid号。ad......
  • CSAPP-Architecture Lab
    PartA前置准备gcc-Wall-O1-g-cyis.cgcc-Wall-O1-g-cisa.cgcc-Wall-O1-gyis.oisa.o-oyisgcc-Wall-O1-g-cyas.cflexyas-grammar.lexmake:fl......