C#中有兩種類型變量,一種是值類型變量,一種是引用類型變量。【淺拷貝就是表面上拷貝了地址;深拷貝就是拷貝了內容 】
對於值類型變量,copy是屬於全盤複製;
而對於引用類型變量,一般的copy只是淺copy,相當於只傳遞一個引用指針一樣。
因此對於引用類型變量進行真正copy的時候,也是最費事的。
淺拷貝
只是複製本身,它包含的對象只是複製引用,其中包含的對象就直接拿來用了,這樣產生的問題就是:如果一個被修改了,另一個也跟着變。是這樣的,但是除了string類型外,string類型,本來屬於引用類型,因此在進行復制的時候,採用的是淺拷貝,但當發生變化的時候,系統會自動生成進行深copy。
對象的字段如果是值類型,那麼無論是淺拷貝還是深拷貝都是原樣複製。
深拷貝
不僅要複製本身,還要複製他所包含對象。對象的字段如果是引用類型,那麼淺拷貝是複製引用,深拷貝是複製引用的對象。
通俗的講:別人想要你們家的房子,你把鑰匙給他了,那叫淺拷貝;你給他蓋了一個一模一樣的,那叫深拷貝;Hashtable和ArrayList等經常需要深度拷貝,而.Net沒有現成的函數可以調用,我從國網站找了一個方法
{
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了!
作者:[email protected] 程序員日記
地址:http://www.ideaext.com/read.php/353.htm