C#中深复制与浅复制的学习。

本文介绍了在.NET中实现对象的深复制和浅复制方法。通过对比值类型和引用类型的复制行为,详细阐述了如何使用MemberwiseClone方法实现浅复制,以及通过硬编码和反射两种方式实现深复制的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.知识预习

        在学习深复制和浅复制前,需要先理清两个概念。引用类型和值类型。对于值类型的复制,我们可以达到深复制的效果。而引用类型,复制新对象后,却都指向了同一个地址,当我们想更改A对象,而对B对象不产生影响,就会很头疼了。。

       因此,本文介绍深复制,浅复制,就是针对引用类型的对象而言的。引用类型对象,比较常用的就是class类型的。下面便展开介绍吧。

2.浅复制。

       浅复制一般使用this.MemberwiseClone()方法进行clone().我们使用它,主要就是在EF类中,新建这个方法即可。调用方式与一般方法调用一样。就不示例说明了。

3.深复制。

已有一个person类型如下:

class Person
    {
        private string mName;

        private int mGrade;

        public int Grade
        {
            get { return mGrade; }
            set { mGrade = value; }
        }
        public string Name
        {
            get { return mName; }
            set { mName = value; }
            
        }

        public Person(string _Name, int _Grade)
        {
            mName = _Name;
            mGrade = _Grade;
        }     
    }

3.1 主要常用的深复制方式有两种,第一种是在EF类中,采用硬编码方式,对已有属性进行重新对象赋值。即增加如下方法就可以实现:

        public Person Clone()
        {
            Person person = new Person();
            person.Name = this.Name;
            person.Grade = this.Grade;
            return person;

        }   

3.2 采用反射方式实现。在主方法中,实现反射方法。

        public static object DeepCopy(object _object)
        {
            Type T = _object.GetType();
            object o = Activator.CreateInstance(T);
            PropertyInfo[] PI = T.GetProperties();
            for (int i = 0; i < PI.Length; i++)
            {
                PropertyInfo P = PI[i];
                P.SetValue(o, P.GetValue(_object));
            }
            return o;
        }

3.3Main方法中测试3.1,3.2中的方法实现。

            Person P = new Person("小红", 10);

            Person n = (Person)DeepCopy(P);//3.2 反射实现

            Person c= P.Clone();//3.1 硬编码方式实现。

            P.Grade = 100;

     然后,再运行中,观察p,n,c三个对象属性值的不同,可以看到深复制是成功实现的了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值