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了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM