C#中的深拷贝和浅拷贝

一:前言

深拷贝:一个对象深拷贝的时候,无论是引用类型对象还是值类型对象,都会创造一个全新的对象,新产生的对象和老对象没有关系
浅拷贝:一个对象浅拷贝的时候,对于对象的值类型成员,会复制其本身,对于对象的引用类型成员,仅仅复制对象引用
总结来说深拷贝和浅拷贝对于引用类型的处理不同,引用类型在浅拷贝时,拷贝的是对象的引用,引用类型在深拷贝时,拷贝的是完整的一份对象


二:解释

对于值类型对象,会复制出一份完整的对象

​​​​​​​int a=1;
int b=a;

对于引用类型对象,仅仅会复制对象的引用
对于引用类型对象,要想实现浅拷贝,不能简单使用=实现,需要使用Object自带的MemberwiseClone


实现浅拷贝和深拷贝需要实现ICloneable接口的Clone方法去调用


三:实现浅拷贝

public class Test : ICloneable
{
    public int v;
    public string name;
    public TestChild child;

    public object Clone()
    {
        return MemberwiseClone();
    }
}

string类型的引用类型较为特殊,当浅拷贝时,是将对应的引用拷贝给了新的对象,但是当旧对象的值发生改变时,新对象的值并不发生改变,因为在每次改变string的值是,都会创建一个新的string对象。即一旦创建了该string对象,就不能修改此对象的值了 


四:实现深拷贝

public static T DeepCopyByReflection<T>(T obj)
{
  if (obj is string || obj.GetType().IsValueType)
  return obj;

  object retval = Activator.CreateInstance(obj.GetType());
  FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
  foreach(var field in fields)
  {
    try
    {
      field.SetValue(retval, DeepCopyByReflection(field.GetValue(obj)));
    }
    catch { }
  }

  return (T)retval;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值