標籤:style blog http color strong 資料 for 2014
概述:
在.NET裡面,提供對象複製的功能,前提是實現ICloneable介面。ICloneable介面中有一個Clone方法,
可以在類中覆寫實現自訂的拷貝方法。對象複製的實現方法有兩種:深複製和淺複製。
深複製和淺複製:
淺複製,淺複製是指來源物件與複製出來的對象共用一份實體,對其中任何一個對象的改動都會影響另外一個對象。相當於複製了指標。
深複製:指來源物件與複製對象互相獨立,為新對象重新分配了一段記憶體空間,並複製來源物件的內容。其中任何一個對象的改動都不會對另外一個對象造成影響。
深淺複製與資料類型:
MemberwiseClone 方法建立當前對象的淺表副本,方法是建立一個新對象,然後將當前對象的非靜態欄位複製到該新對象。
如果欄位是值類型的,則對該欄位執行逐位複製。如果欄位是參考型別,則複製引用但不複製引用的對象;因此,原始對象及其複本引用同一對象。對象複製的實現方法有兩種:淺複製和淺複製。
C#中有兩種類型變數,一種 是值類型變數,一種是參考型別變數(類,介面,數組)。對於前者,複製是屬於深複製;而對於後者,一般的複製只是淺複製,相當於只傳遞一個引用指標一樣。因此 對於後者進行真正深複製的時候,也是最費事的,具體的說,必須為其實現ICloneable介面中提供的Clone方法。
圖解:
代碼說明:C#中的數組是引用型的變數,通過對數組的複製的示範。理解深淺複製。
淺複製:
<span style="font-size:14px;">public class ShallowCopy : ICloneable { public int[] s = { 1,2,3,4 }; public Object Clone() { return this.MemberwiseClone(); } public void Display() { foreach (int i in s) { Console.Write(i + ","); } Console.WriteLine(); } }</span>用戶端:(1)
用戶端:(2)
通過obj1.s[1]=1和obj2.s[2]=1,我們可以看出,淺複製只要任意一個執行個體化的對象對引用的對象進行修改,都以最後一次的修改為準。
深複製:
<span style="font-size:14px;"> public class DeepCopy : ICloneable { public int[] s = { 1, 2, 3, 4}; public DeepCopy() { } private DeepCopy(int[] s) { this.s = (int[])s.Clone(); } public Object Clone() { // 構造一個新的DeepCopy對象 return new DeepCopy(this.s); } public void Display() { foreach (int i in s) { Console.Write(i + ", "); } Console.WriteLine(); } }}</span>用戶端:
深複製執行個體化的對象如果進行修改如obj1.s[1]=1隻是對對象obj1進行了修改,並不影響obj2。
總結:複製功能實現從一個對象在建立另一個可制定的對象,而不需要知道任何建立的細節,我們所學的原型模式就是複製功能的體現。