.NET中深複製與淺複製

來源:互聯網
上載者:User

標籤:style   blog   http   color   strong   資料   for   2014   

概述:
在.NET裡面,提供對象複製的功能,前提是實現ICloneable介面。ICloneable介面中有一個Clone方法,
可以在類中覆寫實現自訂的拷貝方法。對象複製的實現方法有兩種:深複製和淺複製。

深複製和淺複製:

         淺複製,淺複製是指來源物件與複製出來的對象共用一份實體,對其中任何一個對象的改動都會影響另外一個對象。相當於複製了指標。
        深複製:指來源物件與複製對象互相獨立,為新對象重新分配了一段記憶體空間,並複製來源物件的內容。其中任何一個對象的改動都不會對另外一個對象造成影響。


深淺複製與資料類型:

         MemberwiseClone 方法建立當前對象的淺表副本,方法是建立一個新對象,然後將當前對象的非靜態欄位複製到該新對象。
如果欄位是值類型的,則對該欄位執行逐位複製。如果欄位是參考型別,則複製引用但不複製引用的對象;因此,原始對象及其複本引用同一對象。對象複製的實現方法有兩種:淺複製和淺複製。

       C#中有兩種類型變數,一種 是值類型變數,一種是參考型別變數(類,介面,數組)。對於前者,複製是屬於深複製;而對於後者,一般的複製只是淺複製,相當於只傳遞一個引用指標一樣。因此 對於後者進行真正深複製的時候,也是最費事的,具體的說,必須為其實現ICloneable介面中提供的Clone方法。

圖解:


代碼說明:C#中的數組是引用型的變數,通過對數組的複製的示範。理解深淺複製。

淺複製:

<span style="font-size:14px;">public class ShallowCopy : ICloneable    {        public int[] s = { 1,2,3,4 };        public Object Clone()        {            return this.MemberwiseClone();        }        public void Display()        {            foreach (int i in s)            {                Console.Write(i + ",");            }            Console.WriteLine();        }    }</span>
用戶端:(1)


用戶端:(2)


通過obj1.s[1]=1和obj2.s[2]=1,我們可以看出,淺複製只要任意一個執行個體化的對象對引用的對象進行修改,都以最後一次的修改為準。


深複製:

<span style="font-size:14px;"> public class DeepCopy : ICloneable    {       public int[] s = { 1, 2, 3, 4};       public DeepCopy()        {         }        private DeepCopy(int[] s)        {            this.s = (int[])s.Clone();        }        public Object Clone()        {            // 構造一個新的DeepCopy對象            return new DeepCopy(this.s);        }        public void Display()        {            foreach (int i in s)            {                Console.Write(i + ", ");            }            Console.WriteLine();        }    }}</span>
用戶端:

深複製執行個體化的對象如果進行修改如obj1.s[1]=1隻是對對象obj1進行了修改,並不影響obj2。


總結:複製功能實現從一個對象在建立另一個可制定的對象,而不需要知道任何建立的細節,我們所學的原型模式就是複製功能的體現。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.