深拷贝指在拷贝一个对象时,不仅把对象的引用复制了,还复制了对象的引用的值。 看一个简单例子: 我们把source赋值给copy1,当我们把copy1的Name设为Bala时,会发现source.Nameye也会是Bala,因为这种操作方式是浅拷贝,source和copy1指向的是同一个内存空间。
public class A
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
A source = new A() { Name = "Apple"};
A copy1 = source;
copy1.Name="Bala";
}
}
与之相对应的就叫做深拷贝,这种拷贝方式相当于创建了2块独立的内存空间,copy2不会影响到source(感觉跟new一个新对象差不多,但这种方式减少代码量)。最终,source.Name还是Apple,copy2.Name的值是Bala2,两边操作互不影响。
public class A
{
public string Name { get; set; }
public A DeepClone()
{
using (Stream objStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objStream, this);
objStream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(objStream) as A;
}
}
}
class Program
{
static void Main(string[] args)
{
A source = new A() { Name = "Apple"};
A copy2 = source.DeepClone();
copy2.Name="Bala2";
}
}