C# 对象复制 拷贝

在我们工作中经常会用到对象复制的情况,比如 A对象为原有对象,把A对象赋值给B对象,记录原有数据,然后对A对象开始操作改变值,接着想知道 A都改变了那些值
都会先这样写:

A a = new A();
a.ID = 10;
a.Name = "jacky";

A b = a;

a.ID = 11;
a.Name = "zhuovi";

然后 结果并不是我们想要的,a b 两对象的值都被改变了。
有两种对象克隆的方法:浅拷贝和深拷贝。浅拷贝只是复制引用,而不会复制引用的对象。深拷贝会复制引用的对象。
原始对象中的引用和浅拷贝对象中的同一个引用都指向同一个对象。而深拷贝的对象包含了对象的一切直接或间接的引用。
下边给出我经常用的两种方法
1.MemberWiseClone
MemberWiseClone是Object类的受保护方法,能够通过创建一个新对象,并把所有当前对象中的非静态域复制到新对象中,从而创建一 个浅拷贝。对于值类型的域,进行的是按位拷贝。对于引用类型的域,引用会被赋值而引用的对象则不会。因此,原始对象及其克隆都会引用同一个对象。注意,这种方法对派生类都是有效的,也就是说,你只需在基类中定义一次Clone方法。下面是一个简单的例子:

public class A{
    public int ID{get;set;}
    public string Name{get;set;}
    public A Clone(){
        return this.MemberWiseClone() as A;
    }
}

2.用反射进行克隆
直接上代码

System.Reflection.PropertyInfo[] pA = A.GetType().GetProperties();
System.Reflection.PropertyInfo[] pB = A.GetType().GetProperties();
for (int i = 0; i < pA.Length; i++)
{
    if(pB[i].CanWrite)
    pB[i].SetValue(this, pA[i].GetValue(A, null));
}

当前了 还有一种 就是手动赋值 这个就不在这里说了 大家都知道 。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值