首页 > 编程语言 >C#深拷贝

C#深拷贝

时间:2023-08-23 18:34:06浏览次数:36  
标签:obj ms C# static rel new 拷贝 MemoryStream

最近在做winform项目,遇到页面上有同一个数据源的两个ComboBox,此时操作一个ComboBox,会影响到另一个ComboBox,究其原因,是因为数据源是引用类型,值栈引堆,虽然是不同的ComboBox,但是指针指向同一个内存地址,所以操作一个变量会影响到另一个,为解决这个问题,考虑使用深拷贝的方式。

下边是我适用的深拷贝帮助类

    /// <summary>
    /// 深拷贝
    /// </summary>
    public static class DeepCopyHelper
    {
        /// <summary>
        /// 通过XmlSerializer和内存流
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="RealObject"></param>
        /// <returns></returns>
        public static T Clone<T>(T RealObject)
        {
            using (Stream stream = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                serializer.Serialize(stream, RealObject);
                stream.Seek(0, SeekOrigin.Begin);
                return (T)serializer.Deserialize(stream);
            }
        }
        /// <summary>
        /// 通过JsonConvert,序列化和反序列化操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T DeepCopyJson<T>(T obj)
        {// 序列化
            string json = JsonConvert.SerializeObject(obj);
            // 反序列化
            return JsonConvert.DeserializeObject<T>(json);
        }
        /// <summary>
        /// 通过BinaryFormatter和内存流
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static T DeepCopyBinary<T>(T obj)
        {
            object rel; 
            using (MemoryStream ms = new MemoryStream()) 
            { 
                BinaryFormatter bf = new BinaryFormatter(); 
                bf.Serialize(ms, obj); 
                ms.Seek(0, SeekOrigin.Begin); 
                rel = bf.Deserialize(ms); 
                ms.Close(); 
            }
            return (T)rel;
        }
        /// <summary>
        /// 通过DataContractSerializer和内存流
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        private static T DeepCopyDataContract<T>(T obj)
        {
            object rel; 
            using (MemoryStream ms = new MemoryStream()) 
            { 
                DataContractSerializer ser = new DataContractSerializer(typeof(T)); 
                ser.WriteObject(ms, obj); 
                ms.Seek(0, SeekOrigin.Begin); 
                rel = ser.ReadObject(ms); 
                ms.Close(); 
            }
            return (T)rel;
        }
        /// <summary>
        /// 最简单直接的是,循环变量赋值
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        private static List<int> DeepCopyData(List<int> list)
        {
            //此处使用new关键字,创建了对象,所以该变量指向了个新的引用
            List<int> listDeep = new List<int>();
            for(var i=0;i<list.Count;i++)
            {
                var item = list[i];
                listDeep.Add(item);
            }
            return listDeep;
        }
    }

 

标签:obj,ms,C#,static,rel,new,拷贝,MemoryStream
From: https://www.cnblogs.com/Lcsxx/p/17652490.html

相关文章

  • 连接未来 驱动创新|腾讯云 CODING DevOps 主题沙龙诚邀您的参与
    点击链接了解详情随着企业数字化转型步入深水区,DevOps作为数字化转型关键的内建阶段,其应用和实施已经成为企业提升研发效率,实现快速迭代和持续交付的重要手段。然而如何有效地实施DevOps,如何利用DevOps推动业务发展和创新,仍然是许多企业面临的挑战。基于此背景,腾讯云CODI......
  • 无涯教程-PHP Mock Test函数
    本节介绍了与PHP相关的各种模拟测试。您可以在本地计算机上下载这些样本模拟测试,并在方便时离线解决。每个模拟测试均随附一个模拟测试键,可让您验证最终分数并为自己评分。MockTestIMockTestIIMockTestIIIMockTestIVQ1-关于PHP,以下哪项是正确的?A-PHP是......
  • 【成果展示】go-astilectron实现的算法工具
    仓库地址:https://github.com/go-astilectron-demo-crypt_tools......
  • centos7 防火墙
    防火墙的一些操作#查看防火墙状态systemctlstatusfirewalld#开启防火墙systemctlstartfirewalld#关闭防火墙systemctlstopfirewalld#开启防火墙servicefirewalldstart#添加指定需要开放的端口:firewall-cmd--add-port=8090/tcp--permanent#重载入......
  • CF1820 & 1819 题解
    Div2A答案取决于_连续段长度,有一些细节,比如什么时候答案要加一减一,以及字符串是单独的^。Div2B首先先把全\(1\)串给特判掉。记将字符串视为首位相接的环的时,最大\(1\)连续段长度为\(x\),答案为\({\lfloor{x+1\over2}\rfloor}({\lfloor{x\over2}\rfloor+1})\)......
  • CentOS离线安装gcc环境附安装包
    原文链接:https://blog.csdn.net/niceyoo/article/details/1147853331、关于gcclinux内核本身不依赖gcc,gcc只是一个编译软件,是在kernel的源码变成可执行文件的时候起作用,真正使用起来就没有什么关系。查看gcc版本gcc-v如果没有则显示:2、安装步骤2.1、下载gcc安装包gcc下载地......
  • JDK8 LocalDateTime 自定义周开始
    LocalDateTimenow=LocalDateTime.of(2022,12,31,0,1,1);WeekFieldsweekFields=WeekFields.of(DayOfWeek.FRIDAY,1);intdayOfWeek=now.getDayOfWeek().get(weekFields.dayOfWeek());System.out.println("日期:"+......
  • WebRTC入门
    1、概念WebRTC(WebReal-TimeCommunications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。2、通讯流程的建立首先,从概念可以看出,WebRTC通讯过程不需要中间媒介(P......
  • 为什么vite比webpack速度快
    一.webpack为什么慢主要是由于其内部的核心机制——bundle模式引发的webpack通过bundle机制,将项目中各种类型的源文件转化供浏览器识别的js、css、img等文件,建立源文件之间的依赖关系,将数量庞大的源文件合并为少量的几个输出文件。bundle工作机制的核心部分分为两块:构建......
  • linux中echo命令
    参考echo命令是日常linux任务中使用最广泛的命令之一。echo命令是一个内置的命令行工具,它将文本或字符串打印到标准输出或将输出重定向到文件。该命令通常在bashshell或其他shell中用于打印命令的输出。echo命令在bashshell脚本中也经常使用。基本语法$echo[opt......