1、memberwiseclone方法建立乙個淺表副本,具體來說就是:
①建立乙個新物件
,②將當前物件的非靜態字段複製到該新物件。
ⅰ如果欄位是值型別的,則對該字段執行逐位複製
。ⅱ如果欄位是引用型別,則
複製引用但不複製引用的物件
;因此,
原始物件及其複本引用同一物件
。2、為了實現深度複製,我們就必須遍歷有相互引用的物件構成的圖,並需要處理其中的迴圈引用結構。這無疑是十分複雜的。
幸好借助.net的序列化和反序列化機制,可以十分簡單的深度clone乙個物件
。原理很簡單,首先將物件序列化到記憶體流中,此時物件和物件引用的所用物件的狀態都被儲存到記憶體中。.net的序列化機制會自動處理迴圈引用的情況。然後將記憶體流中的狀態資訊反序列化到乙個新的物件中。這樣乙個物件的深度複製就完成了。在原型設計模式中clone技術非常關鍵。
usingsystem;
using
system.io;
using
system.runtime.serialization.formatters.binary;
namespace
clonedemo
;
public democlass clone1() //
淺clone
public democlass clone2() //
深clone
} class
program
;democlass b =a.clone1();
democlass c =a.clone2();
//更改 a 物件的iarr[0], 導致 b 物件的iarr[0] 也發生了變化 而 c不會變化
a.iarr[0] = 88
; console.writeline(
"memberwiseclone");
console.writeline(b.i);
foreach (var item in
b.iarr)
console.writeline(
"clone2");
console.writeline(c.i);
foreach (var item in
c.iarr)
console.readline();}}
}
輸出結果:
memberwiseclone
1088910
clone2108
910
深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...