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;
}

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/129585191