深拷贝与浅拷贝
什么是深拷贝和浅拷贝?
假如老张需要一台冰箱,于是老张花2000块买了一台冰箱,老张就拥有了一台冰箱,老张往冰箱里面塞满了自己喜欢的东西。有一天老刘说他也需要一台冰箱,老张知道后就把冰箱位置告诉了老刘,于是老刘也有了一台冰箱,老张跟老刘一 起快乐的吃冰箱的东西。我们管老刘获得冰箱的方式叫做浅拷贝。
有一天老张感觉两个人用冰箱太麻烦,于是老张出钱给老刘买了一台冰箱用,于是老刘自己也有了自己的冰箱,这时候他们两个人各自拥有自己的冰箱,这种方式叫做深拷贝。
代码实现
//冰箱
public class Bingxiang
{
private string lengcang;
public string LengCang
{
get { return lengcang; }
set { lengcang = value; }
}
}
//老张有一个大冰箱
Bingxiang laozhang = new Bingxiang();
//老刘啥也没有
Bingxiang laoliu;
//老张把冰箱位置告诉老刘
laoliu = laozhang;
//老张老刘一起快乐的使用冰箱
laoliu.LengCang += "老刘放进去五花肉";
laozhang.LengCang += " 老张放进去啤酒";
//看下老张跟老刘冰箱里都有啥
Console.WriteLine("老张的冰箱:" + laozhang.LengCang);
Console.WriteLine("老刘的冰箱:" + laoliu.LengCang);
Console.ReadKey();
发现两个人用的是同一台冰箱!!(浅拷贝)
所以得出结论自定义类Bingxiang是浅拷贝类型。
//老张有一个2000块大冰箱
int laozhang = 2000;
//老刘啥也没有
int laoliu;
//老张花钱给老刘买了新冰箱
laoliu = laozhang;
//老张花100块给冰箱加了五花肉
laozhang += 100;
//老刘花50块给冰箱加了啤酒
laoliu += 50;
//看下老刘跟老张的冰箱都有啥
Console.WriteLine("老张的冰箱:" + laozhang);
Console.WriteLine("老刘的冰箱:" + laoliu);
Console.ReadKey();
发现老张冰箱多了100块的五花肉,老刘冰箱多了50块的啤酒,两个人各用各冰箱,互不干扰!!(深拷贝)
所以得出结论int类型是深拷贝类型。
深拷贝的实现方式
这时候存在一个问题,假如老刘也想要一个新的Bingxiang类型的冰箱,要怎么处理?
//老张有一个2000块大冰箱
Bingxiang laozhang = new Bingxiang();
//老刘啥也没有
Bingxiang laoliu;
//老张花钱给老刘买冰箱
laoliu = DeepCopy(laozhang);
//老张老刘分别使用冰箱
laoliu.LengCang += "老刘放进去五花肉";
laozhang.LengCang += "老张放进去啤酒";
//看下老张老刘冰箱都有啥
Console.WriteLine("老张的冰箱:" + laozhang.LengCang);
Console.WriteLine("老刘的冰箱:" + laoliu.LengCang);
Console.ReadKey();
public static T DeepCopy<T>(T obj)
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
DataContractSerializer ser = new DataContractSerializer(typeof(T));
ser.WriteObject(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
retval = ser.ReadObject(ms);
ms.Close();
}
return (T)retval;
}
发现老张冰箱里只有自己的啤酒,老刘冰箱里只有自己的五花肉。(自定义Bingxiang类实现深拷贝)
最后老张老刘可以愉快的吃着五花肉喝啤酒了。。。