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

作者:[email protected] 程序員日記
地址:http://www.ideaext.com/read.php/353.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章