C#深度拷贝
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了!