C#深度拷贝

来源:互联网 发布:读书 知乎 编辑:程序博客网 时间:2024/04/28 15:02
C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。【浅拷贝就是表面上拷贝了地址;深拷贝就是拷贝了内容 】
对于值类型变量,copy是属于全盘复制; 
而对于引用类型变量,一般的copy只是浅copy,相当于只传递一个引用指针一样。 
因此对于引用类型变量进行真正copy的时候,也是最费事的。

浅拷贝 
只是复制本身,它包含的对象只是复制引用,其中包含的对象就直接拿来用了,这样产生的问题就是:如果一个被修改了,另一个也跟着变。是这样的,但是除了string类型外,string类型,本来属于引用类型,因此在进行复制的时候,采用的是浅拷贝,但当发生变化的时候,系统会自动生成进行深copy。
对象的字段如果是值类型,那么无论是浅拷贝还是深拷贝都是原样复制。 
深拷贝
不仅要复制本身,还要复制他所包含对象。对象的字段如果是引用类型,那么浅拷贝是复制引用,深拷贝是复制引用的对象。 
通俗的讲:别人想要你们家的房子,你把钥匙给他了,那叫浅拷贝;你给他盖了一个一模一样的,那叫深拷贝;Hashtable和ArrayList等经常需要深度拷贝,而.Net没有现成的函数可以调用,我从网上找了一个方法

public object Clone()
{
BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
MemoryStream stream = new MemoryStream();
Formatter.Serialize(stream, this);
stream.Position = 0;
object clonedObj = Formatter.Deserialize(stream);
stream.Close();
return clonedObj; 
}

继承了Clonable接口之后,像这样重写Clone()方法就可以了,他利用了序列化和反序列化的原理,将序列化的流丢入内存,再从内存中反序列化回来就OK了!

0 0
原创粉丝点击