C 深淺複製 MemberwiseClone

2021-09-07 17:53:25 字數 2627 閱讀 9689

學無止境,精益求精

十年河東,十年河西,莫欺少年窮

學歷代表你的過去,能力代表你的現在,學習代表你的將來

最近拜讀了大話設計模式:原型模式,該模式主要應用c# 深淺複製來實現的!關於深淺複製大家可參考msdn:

所謂深淺複製可解讀為:

淺複製:在c#中呼叫 memberwiseclone() 方法即為淺複製。如果欄位是值型別的,則對字段執行逐位複製,如果欄位是引用型別的,則複製物件的引用,而不複製物件,因此:原始物件和其副本引用同乙個物件!

深複製:如果欄位是值型別的,則對字段執行逐位複製,如果欄位是引用型別的,則把引用型別的物件指向

乙個全新的物件!

上述的解釋可能看不太懂,我們作如下案例進行分析:

class

program

public

static

void

displayvalues(person p)

, age:

", p.name, p.age);

console.writeline(

"value:

", p.idinfo.idnumber);}}

public

class

idinfo

}public

class

person

public

person deepcopy()

}

view code

上述**分析如下:

原始物件p1,通過淺複製得到物件p2,通過深複製得到p3

原始物件p1中的值型別屬性有:age 和 name ,引用型別物件有:idinfo

根據上述深複製的概念可知:p3中的age 和 name 相對於 p1是全新的,但p3中的 idinfo 和 p1中的 idinfo 不是同乙個物件,也就是說 p3中的idinfo是乙個全新的物件,開闢了自己的記憶體位址!

上述**測試如下:

我們現在講**修改如下:

public

static

void

main()

在輸出p2之前,我們修改了p1物件的值型別name 和 引用型別 idinfo 。

無論是淺複製還是深複製,副本中的值型別都是全新的!

淺複製中原始物件和副本的引用型別指向同一記憶體位址,所以,修改了p1的idinfo會同時影響p2的idinfo

輸出如下:

繼續修改**,如下:

public

static

void

main()

深複製中原始物件和副本的引用型別指向各自的位址,兩者完全是兩個不同的物件!因此:修改p1不會影響p3

so,是不是很簡單,是不是很easy.

深淺複製主要用於當建立乙個物件需要消耗過多資源時,可以採取複製的方法提公升效率!

大話設計模式的原話是這樣滴:當你new乙個物件時,每new一次,都需要執行乙個建構函式,如果

建構函式的執行時間很長

,那麼多次new物件時會大大拉低程式執行效率,因此:一般在初始化資訊不發生變化的前提下,轉殖是最好的辦法,這既隱藏了物件的建立細節,又大大提公升了效能!

當然,如果每個類都要寫自己的深複製,這豈不是非常非常麻煩,因此,有乙個通用的深複製方法,如下:

///

///通用的深複製方法

/// ///

[serializable]

public

class baseclone

}

class

program

public

static

void

displayvalues(person p)

, age:

", p.name, p.age);

console.writeline(

"value:

", p.idinfo.idnumber);}}

[serializable]

public

class

idinfo

}[serializable]

public

class person : baseclone

public

person deepcopy()

public

override

person clone()

}//////

通用的深複製方法

/// ///

[serializable]

public

class baseclone

}

view code

@陳臥龍的部落格

oc 深淺複製

淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...

深淺複製 2

前面講了深淺複製的概念,而實操中我們會遇到更多的情況 我們可以看到這兩個copywithzone方法在arc下已經是放棄了,這兩個方法的使用非常簡單,一般的格式如下 1.實現nscopying協議 2.實現copywithzone方法 3.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...

Python 深淺複製

python中的賦值語句不複製物件,它們在目標和物件之間建立繫結。對於可變的或包含可變項的容器,有時需要乙個副本,所以可以改變乙個副本而不改變另乙個。將建立乙個新物件,但它包含的是對原始物件包含的項的引用。a b list a c a.copy d copy.copy a 建立乙個新物件,並且遞迴的...