天天看點

深複制VS淺複制(MemberwiseClone方法介紹)

MemberwiseClone方法,屬于命名空間System,存在于程式集 mscorlib.dll中。傳回值是System.Object。其含義是:建立一個目前object對象的淺表副本。

MSDN中的官方解釋是:

MemberwiseClone 方法建立一個淺表副本,方法是建立一個新對象,然後将目前對象的非靜态字段複制到該新對象。如果字段是值類型的,則對該字段執行逐位複制。如果字段是引用類型,則複制引用但不複制引用的對象;是以,原始對象及其複本引用同一對象。

例如:考慮引用對象 A 和 B 的被稱為 X 的對象。對象 B 依次引用對象 C。X 的淺表副本建立一個新對象 X2,該對象也引用對象 A 和 B。相比而言,X 的深層副本建立一個新對象 X2,該對象引用新對象 A2 和 B2(分别為 A 和 B 的副本)。B2 又引用新對象 C2,C2 是 C 的副本。該示例闡釋了淺層和深層複制操作之間的差別。

有很多方法可以實作深層複制操作,前提是淺表複制操作由MemberwiseClone 方法執行但不符合您的需求。這些要求包括:

1、調用要複制的對象的類構造函數以建立含有從第一個對象中提出的屬性值的第二個對象。這假定對象的值完全由類構造函數定義。

2、調用MemberwiseClone 方法建立的對象的淺表副本,然後将指定新的對象,其值均相同,原始對象的任何屬性或字段的值是引用類型。該示例中的DeepCopy 方法闡釋了這種方法。

3、序列化要深層複制的對象,然後将序列化的資料還原到另一個對象變量。

4、 使用帶遞歸的反射執行的深層複制操作。

估計看到這你早就已經是暈的不行了吧!呵呵,本菜鳥也是這樣滴……在自己的不懈努力之下,并且從執行個體中試驗過後才弄明白,原來這個所謂的淺複制和深複制是如此的簡單啊!

其實,用咱們在windows作業系統中使用的快捷方式和源檔案的關系來了解就簡單了!相信大家從玩電腦開始可能都遇到過這樣的尴尬局面,就是用u盤複制了電腦的檔案,然後興高采烈的去列印,然後一到列印店打開u盤中複制到的檔案,“納尼!怎麼打不開呢!原來是自己複制了一個快捷方式,額&……”(哈哈……說到這,估計有的人就非常有共鳴了啦!是吧?)

快捷方式:其實就相當于是引用源檔案,快捷方式中并不存在源檔案對象,隻是存放了一個源檔案的位址,這個位址指向源檔案,當你輕按兩下的時候,windows會根據這個位址去你的電腦尋找這個源檔案并打開。隻複制一個快捷方式,這就相當于是淺複制啦

複制源檔案:将檔案的資料都複制過來,這就是所謂的深複制。

有關深複制和淺複制的詳細内容請參看本人以下部落格:

大話設計模式—原型模式