一:前言
深拷贝:一个对象深拷贝的时候,无论是引用类型对象还是值类型对象,都会创造一个全新的对象,新产生的对象和老对象没有关系
浅拷贝:一个对象浅拷贝的时候,对于对象的值类型成员,会复制其本身,对于对象的引用类型成员,仅仅复制对象引用
总结来说深拷贝和浅拷贝对于引用类型的处理不同,引用类型在浅拷贝时,拷贝的是对象的引用,引用类型在深拷贝时,拷贝的是完整的一份对象
二:解释
对于值类型对象,会复制出一份完整的对象
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;
}