C#深拷贝

C#深拷贝 反射实现 项目中经常遇到需要将一个对象深拷贝出来做其他事情,而原对象保持原有状态的情况。 当时又不想自己new一个出来,然后对着一堆字段赋值...... 多次遇到这样的需求后就想着用反射实现。 #region 对象拷贝 //引入命名空间using System.Reflection; /// /// 对象拷贝 /// 阅读详情

C#的深拷贝,需要自己实现逻辑,目前我没有发现微软提供了可供调用的API。微软只是提供ICloneable接口,此接口只是为我们提供了一个规范,必须实现object Clone();方法,如下代码:

public class Person : ICloneable
{
    public int ID { get; set; }
    public string Name { get; set; }
    Object Clone(){
        Person newPerson = new Person();
        newPerson.ID = this.ID;
        newPerson.Name = this.Name;
        return newPerson;
    }
}

下面是调用方法:

Person oldPerson = new Person();
oldPerson.ID = 1;
oldPerson.Name = "Terry";
Person newPerson = (Person)oldPerson.Clone();
newPerson.Name = "Harry";
Console.WriteLine("old person's name is " + oldPerson.Name);//他们输出的Name是不一致的,所以说实现了深拷贝
Console.WriteLine("new person's name is " + newPerson.Name);

此时可能会有人问了,既然具体实现逻辑还要自己写,干嘛要继承ICloneable接口呢?
其实微软定义了这么个接口,是基于软件工程方面的考虑,提高代码的规范性。试想如果一个项目组有多个人在实现深拷贝,而又没有继承ICloneable这个接口,那么结果会是什么样呢?可以肯定的是,在接口、拷贝方法命名上会有多个版本存在。

当然,如果我们不想这么麻烦,可以考虑使用反射的机制来实现深拷贝,不过这样的话对性能会有影响,下面是样例代码:

public static class ExntedHelper
    {
        /// <summary>
        /// 深复制
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <returns></returns>
        public static T CopySameFieldObject<T>(this Object source)
        {
            Type _SrcT = source.GetType();
            Type _DestT = typeof(T);

            // 构造一个要转换对象实例
            Object _Instance = _DestT.InvokeMember("", BindingFlags.CreateInstance, null, null, null);

            // 这里指定搜索所有公开和非公开的字段
            FieldInfo[] _SrcFields = _SrcT.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            // 将源头对象的每个字段的值分别赋值到转换对象里,因为假定字段都一样,这里就不做容错处理了
            foreach (FieldInfo field in _SrcFields)
            {
                if (field.GetValue(source) != null)
                        _DestT.GetField(field.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).
                            SetValue(_Instance, field.GetValue(source));
            }

            return (T)_Instance;
        }
    }

调用代码:

Person oldPerson = new Person();
oldPerson.ID = 1;
oldPerson.Name = "Terry";
Person newPerson = oldPerson.CopySameFieldObject<Person>();
newPerson.Name = "Harry";
Console.WriteLine("old person's name is " + oldPerson.Name);//他们输出的Name是不一致的,所以说实现了深拷贝
Console.WriteLine("new person's name is " + newPerson.Name);
C#中的浅拷贝(Shallow Copy)和深拷贝(Deep Copy),深拷贝的集中实现方式,浅拷贝深拷贝的案例 拷贝就是创建一个对象,这个对象有着原始对象数据(属性和字段)的一份精确拷贝(只针对**Object**和**Array**这样的引用数据类型)。 换个说法就是:所谓的对象拷贝(复制)就是为对象创建副本,得到相同的对象。 阅读详情

相关推荐

C# 实现对象的深拷贝

C# 实现对象的深拷贝在 C# 编程中,对象的拷贝是一个常见的操作。有时候我们需要对对象进行深拷贝,即创建一个与原始对象完全相等但独立于原始对象的新对象。本文将介绍如何使用 C# 实现对象的深拷贝,并提供相应的源代码和描述。在 C# 中,对象的浅拷贝可以通过 方法实现。然而,该方法只会复制对象的字段,并不复制引用类型的成员。因此,为了实现对象的深拷贝,我们需要采用其他方法。接下来,我们将介绍两种常用的方式来实现对象的深拷贝:序列化和反射。方法一:使用序列化实现深拷贝首先,我们需要确保对象的类和成员都是可序

DevGOOD的博客 1319

c# 深拷贝各种实现方式

1:利用反射实现 public T DeepCopy<T>(T obj) { object retval= Activator.CreateInstance(typeof(T)); PropertyInfo[] pis = typeof(T).GetProperties(); foreach (...

u011555996的博客 1115

四足机器人通用运动控制策略:强化学习与PD参数优化

运动控制是机器人实现稳定行走和复杂动作的核心技术,其关键在于精确调节关节的刚度和阻尼特性。PD控制器作为基础控制单元,通过比例(P)和微分(D)增益参数直接影响系统响应速度与稳定性。在四足机器人领域,强化学习(RL)通过模拟环境自主学习,能够有效解决传统控制方法难以适应不同形态机器人的痛点。该技术通过非对称Actor-Critic架构,结合状态估计网络和自适应参数采样策略,实现了跨平台的通用运动控制。典型应用包括工业检测、灾害救援等需要高适应性移动能力的场景,其中PD增益优化和形态参数自适应采样成为提升硬件

weixin_30307921的博客 300

c#实现深拷贝的几种方法

  为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做,看代码    public class Person {   public string Name { get; set; } } class Program {   st...

weixin_34200628的博客 2834

谷粒商城学习笔记-15-数据库初始化

这一节的主要内容是把创建对应的数据库和数据库表。

epitomizelu的专栏 1438

Windows 11下WSL2安装CUDA避坑指南:从驱动版本匹配到环境变量配置

本文详细解析了在Windows 11的WSL2中搭建CUDA开发环境的完整流程与核心避坑要点。关键在于理解“驱动在Windows,工具链在Linux”的独特架构,并确保显卡驱动与CUDA Toolkit版本严格匹配。指南涵盖了从驱动验证、WSL-Ubuntu专用仓库安装、环境变量配置到GCC版本冲突、GPU算力不匹配等常见问题的解决方案,帮助开发者高效构建稳定的深度学习与高性能计算环境。

smartcontract5的博客 468

C#中Object的深拷贝

简介: C#中System.Object 是所有类类型、结构类型、枚举类型和委托类型的基类。可以说它是类型继承的基础。System.Object包括一个用于创建当前对象实例的一份拷贝的MemberwiseClone的成员方法。 问题描述: System.Object的MemberwiseClone方法创建一个新对象的浅拷贝,并把当前对象实例的非静态字段拷贝至新对象实例中。通过属性,...

aominhui5799的博客 773

私有云平台搭建——OpenStack

私有云平台搭建——OpenStack 搭建过程

2301_79739036的博客 3092

C#四种深拷贝方法

C#四种深拷贝方法 //四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || obj.GetType().IsValueType) return obj; ...

cxu123321的博客 4341

AI Agent Harness Engineering 开发效率工具:Prompt工程、调试与监控平台

随着AI Agent技术从原型探索走向企业级落地,开发者普遍面临Prompt迭代无版本管控、Agent执行黑盒无法定位错误、上线后无监控导致故障频发、多团队协作效率低下四大核心痛点,据2024年LLMOps行业报告显示,没有配套工具链的Agent开发团队平均迭代周期是有工具链团队的6倍,线上故障率高达23%,平均资源浪费超过60%。

小白菜的博客 427

MetaERP 的管理单元在设计哲学和实现逻辑上,确实与 Oracle EBS 的业务实体(OU)一脉相承,你可以放心地在已知的 Oracle 多组织架构框架下进行理解。它并没有推翻这套经典的核算模型

MetaERP的管理单元设计继承了Oracle EBS业务实体(OU)的核心思想,并进行了现代技术重构。管理单元(MU)作为OU的超集,延续了业务数据隔离与流程执行边界的定位,但通过元数据驱动的多租户架构实现更灵活的数据隔离。MetaERP采用三层解耦设计(核算单元、自然科目、核算维度),解决了EBS科目组合爆炸问题,并实现事件驱动的实时核算。相较于EBS的批处理模式,MetaERP通过云原生架构和元数据驱动配置,显著提升了灵活性、实时性和扩展性,支持跨法人的业务统一管理视图。

金牌架构师 576

C#对象深拷贝

C#对象深拷贝 众所周知,c#中的对象存在值类型和引用类型之分,故而对象之间的赋值就存在浅拷贝和深拷贝的概念 网上的深拷贝方法也很多,但是要么写的无比复杂,要么有诸多限制 最终还是选择了反射的方法,虽然都说反射效率太低,但是它毕竟最常见最通用的方法 public static T DeepCopy<T>(T obj) { ...

1715

PVE虚拟机运行不流畅,出现卡顿。

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 3065

c# 深拷贝浅拷贝

浅拷贝:仅仅把对象的引用进行拷贝,但是拷贝对象和源对象是引用同一份实体。此时,其中的一个的成员对象的改变都会影响到另外一个成员的对象 深拷贝:指的是拷贝一个对象时,不仅仅把对象的引用进行拷贝,还把该对象引用的值也一起拷贝。这样进行拷贝后的副本对象就和源对象互相独立,其中任何一个的成员对象改动都不会对两外一个成员对象造成影响 C#实现浅拷贝:调用MemberwiseClone方法,创建一个新的对象,然后复制当前对象的非静态字段的新对象创建一个浅副本。 C# 深拷贝的有三种实现: 1.反射 2.序列化

m0_58717895的博客 3683

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解

氢键H-H 5681

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

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

C# 中的浅拷贝和深拷贝

C#中的浅复制和深复制示例 在本文中,我将通过示例讨论C#中的浅拷贝和深拷贝。这是我们上一篇文章的续篇。因此,在继续本文之前,请阅读我们以前的文章,其中我们使用示例讨论了C#中的原型设计模式。 浅复制和深复制在复制原型设计模式中的对象中起着重要作用。因此,在本文中,我们将通过示例讨论什么是“浅复制”和“深复制”以及它们之间的区别。 了解C#中的浅表复制: 如果是“浅复制”,它将从现有对象创建新对象,然后将当前对象的值类型字段复制到新对象。但是在引用类型的情况下,它将仅复制引用,而不复制被引用对象本身

ananlele_的专栏 2429

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

在C#中如何实现集合的深拷贝

在C#中,实现集合的深拷贝(deep copy)涉及创建一个新的集合,并递归地复制原始集合中的所有元素及其嵌套的对象。深拷贝与浅拷贝(shallow copy)的区别在于,深拷贝不仅复制对象的引用,还复制对象本身及其包含的所有子对象。

学习和分享 1441

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#浅拷贝和深拷贝数据

可见,修改testData1的D1的值后,test2的D1的值,并没有变化,这正是我们需要的,后续可以对testData1和test2的数据,分别进行业务操作。这里我们首先是先把对象转成字符串,再把字符串转成对象,效果和上面是一样的。这个就是浅拷贝,这种拷贝在程序场景中很少用到,不知道的人,偶尔会很奇怪。前面的数据结构依然不变,深拷贝在程序中运用的场景非常多,我们说4种方法。当修改testData1的D1的值后,test1的D1的值也改变了。共享地址的,修改第一份数据或者修改第二份数据,

故里2130 3527

C#入门——浅拷贝与深拷贝

浅拷贝与深拷贝的定义浅拷贝:复制对象时,只复制它直接引用的对象,并不递归地复制这些引用的对象内部的内容。这意味着如果原对象中的任何元素是可变对象(如列表或自定义对象),那么新旧对象将共享这部分数据。深拷贝:创建一个新的对象,并且递归地复制原始对象及其所有嵌套对象的内容。这样得到的新对象与原始对象完全独立,修改一个不会影响另一个。直接上代码,看完悟了请三连!没悟的再看一遍 ʅ(´◔౪◔)ʃ。

qq_40771050的博客 2240

【C#语言】深拷贝与浅拷贝

在 C# 编程的世界里,深拷贝与浅拷贝是我们处理对象复制时的两把利刃。浅拷贝操作简单、效率较高,在处理大量对象且引用类型字段不会被修改的场景下,能够快速地创建对象副本,为程序节省时间和内存资源。然而,它的局限性也很明显,当涉及到引用类型字段的修改时,可能会导致数据不一致的问题。深拷贝则为我们提供了更彻底的对象复制方式,确保原始对象和副本对象在内存中完全独立,互不干扰。尽管实现深拷贝的方式多样,每种方式都有其独特的优缺点和适用场景,但在处理复杂对象结构和需要严格数据隔离的场景中,深拷贝是必不可少的。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1350

C#关于深拷贝的坑

C#关于深拷贝的坑 问题及分析 目前遇到的一个问题: 有一个List<MyClass> target对象,需要把target备份一份,防止在界面中对target的内容修改后又取消,此时需要将target的数据进行还原,一开始时使用如下代码备份: class MyType { public string val = "origin"; } class Program { static void Main(string[] args) { // 原始数

李正浩的博客 430

C#中的浅拷贝和深拷贝

在上面的示例中,我们使用DeepCopy方法进行深拷贝,该方法创建一个新的Person对象,并将原始对象的数据复制到新对象中。浅拷贝的缺点是不能保证对象副本的完整性和一致性,因为如果原始对象或其引用的对象发生变化,那么浅拷贝的对象也会受到影响。深拷贝的优点是可以创建一个完全独立的对象副本,不会受到原始对象的任何修改或删除的影响。浅拷贝是将对象的引用复制到新的对象中,而深拷贝则是将整个对象及其所有嵌套对象的数据复制到新的对象中。深拷贝创建一个新的对象,并复制原始对象的所有数据和嵌套对象的数据到新对象中。

polsnet的专栏 658
上一篇: Verify the project is selected to be deployed in the Solution Configuration Manager.解决方案
下一篇: tomcat7.0.59对el取消过滤java关键字的设置
mx5721
博客等级 码龄17年 24粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值