天天看點

淺克隆與深克隆

(1)淺克隆

在淺克隆中,如果原型對象的成員變量是值類型,将複制一份給克隆對象;如果原型對象的成員變量是引用類型,則将引用對象的位址複制一份給克隆對象,也就是說原型對象和克隆對象的成員變量指向相同的記憶體位址。簡單來說,在淺克隆中,當對象被複制時隻複制它本身和其中包含的值類型的成員變量,而引用類型的成員對象并沒有複制,如圖:

淺克隆與深克隆

通過實作ICloneable接口的Clone()方法,并調用MemberwiseClone()方法來實作淺克隆

淺克隆與深克隆

(2)深克隆

在深克隆中,無論原型對象的成員變量是值類型還是引用類型,都将複制一份給克隆對象,深克隆将原型對象的所有引用對象也複制一份給克隆對象。簡單來說,在深克隆中,除了對象本身被複制外,對象所包含的所有成員變量也将複制,如圖:

淺克隆與深克隆

在C#語言中,如果需要實作深克隆,可以通過序列化(Serialization)等方式來實作。序列化就是将對象寫到流的過程,寫到流中的對象是原有對象的一個拷貝,而原對象仍然存在于記憶體中。通過序列化實作的拷貝不僅可以複制對象本身,而且可以複制其引用的成員對象,是以通過序列化将對象寫到一個流中,再從流裡将其讀出來,可以實作深克隆。需要注意的是能夠實作序列化的對象其類必須實作Serializable接口,否則無法實作序列化操作。

淺克隆與深克隆

繼續閱讀