淺拷貝 深拷貝

2022-06-08 14:57:08 字數 1423 閱讀 6173

所謂淺拷貝就是將物件中的所有字段複製到新的副本物件中;淺拷貝對於值型別與引用型別的方式有區別,值型別欄位的值被複製到副本中後,在副本中的修改不會影響源物件對應的值;然而對於引用型別的字段被複製到副本中的卻是引用型別的引用,而不是引用的物件,在副本中對引用型別的字段值被修改後,源物件的值也將被修改。

深拷貝也同樣是將物件中的所有字段複製到副本物件中,但是,無論物件的值型別字段或者引用型別字段,都會被重新建立並複製,對於副本的修改,不會影響到源物件的本身;

這裡我們需要注意一點student中的idcode屬性是string型別,理論上string型別是引用型別,但是由於該引用型別的特殊性,object.memberwiseclone方法仍舊為他建立了副本,也就是說,在淺拷貝過程中,我們應該將字串看成值型別;

建議使用序列化的形式來進行深拷貝

#region 拷貝主體

/// /// 深度拷貝

///

///

public student deepclone()

}public object clone()

#endregion

memberwiseclone:建立當前 object 的淺表副本。

memberwiseclone 方法建立乙個淺表副本,方法是建立乙個新物件,然後將當前物件的非靜態字段複製到該新物件。如果欄位是值型別的,則對該字段執行逐位複製。如果欄位是引用型別,

則複製引用但不複製引用的物件;因此,原始物件及其複本引用同一物件。

對於引用型別的變數,我們有種誤解,認為賦值操作就是淺拷貝一種,其實不然,兩者有區別。

淺拷貝(shallow copy)對於引用型別物件中的值型別字段進行了逐位複製。賦值運算子只是把源物件的引用賦值給目的物件,兩者引用同乙個物件。

淺拷貝後的物件的值型別字段更改不會反映到源物件,而賦值運算後的物件的值型別字段更改會反映到源物件

在c#中,我們們有三種方法實現深拷貝

實現icloneable介面,自定義拷貝功能。

icloneable 介面,支援轉殖,即用與現有例項相同的值建立類的新例項。

icloneable 介面包含乙個成員 clone,它用於支援除 memberwiseclone 所提供的轉殖之外的轉殖。clone 既可作為深層副本實現,也可作為淺表副本實現。在深層副本中,所有的物件都是重複的;而在淺表副本中,只有頂級物件是重複的,並且頂級以下的物件包含引用。 結果轉殖必須與原始例項具有相同的型別或是原始例項的相容型別。

序列化是將物件或物件圖形轉換為線性位元組序列,以儲存或傳輸到另乙個位置的過程。反序列化是接受儲存的資訊並利用它重新建立物件的過程。

通過 iserializable 介面,類可以執行其自己的序列化行為。

轉換為線性位元組序列後並利用其重新建立物件的過程是不是和我們的深拷貝的語意「逐位複製」很相像?淺拷貝是對引用型別拷貝位址,對值型別直接進行拷貝。

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...