.NET架構-Clone詳請介紹

黄舟
發布: 2017-03-18 13:16:53
原創
1699 人瀏覽過

  .NET中有很多物件都實作了IClonable接口,這表示它們能實現複製功能,比如說ArrayList物件( 用C##描述資料結構3:ArrayList),或自己編寫實作了IClonable介面的物件。

  查看ArrayList中關於Clone方法的介紹:

#建立 System.Collections.ArrayList 的淺表副本。

  很好奇,淺表副本的概念,上msdn查閱後,解釋的意思比較晦澀一點,淺表複製集合是指僅複製集合元素,不管元素是值類型還是引用類型,但是Clone並不會複製物件(引用指向的物件)。新Clone後的集合中,引用還是指向同一個物件(原來集合中引用指向的物件)。

A shallow copy of a collection copies only the elements of the collection, whether they are reference types or value types, but it does not copy the objects that the references references reference in. collection point to the same objects that the references in the original collection point to.

  一句話概括,Clone實現的所謂淺表副本,Clone出來的對象複製#了值類型,複製了引用,而未複製引用物件。這時候,可能就要問了,未複製引用物件是什麼意思?透過程式碼是最好說明問題的,請看下面的程式碼,

        //人员对象模型
        public class Person
        {            public string name { get; set; }            
        public ContactInfo description { get; set; }    

            public Person(string name, ContactInfo description)
            {                this.description = description;                
            this.name = name;
            }
        }        //联系信息对象
        public class ContactInfo
        {            public string address { get; set; }            
        public string telephone { get; set; }            
        public ContactInfo(string address, string telephone)
            {                
            this.address = address;                
            this.telephone = telephone;
            }            
            //跟新电话联系信息
            public void UpdateTelephone(string telephone)
            {                
            this.telephone = telephone;
            }
        }
登入後複製

  新建一個ArrayList對象,並分別新增為一個引用對象,一個值類型資料

             //ArrayList对象
            ArrayList arr1 = new ArrayList();            
            //Person对象创建,xiaoming引用Person对象
            Person xiaoming = new Person("xiaoming",new ContactInfo("shanghai","18011113333"));            
            //arr1引用xiaoming,这样arr1[0]也引用了Person对象
            arr1.Add(xiaoming);            
            //arr1中添加值类型整形5元素
            arr1.Add(5);
登入後複製

  我們透過Clone介面,Clone出一個arr1的淺表副本:

ArrayList cloneArr1 = arr1.Clone() as ArrayList;
登入後複製

如圖所示:


.NET架構-Clone詳請介紹

  分別測試,克隆出來的實例cloneArr1都複製了什麼,我們分別check下值型別和引用型別的複製情況。先看值類型的複製情況:
cloneArr1[1]=6;
登入後複製

  我們檢查下初始的集合arr1[1]的元素改變了嗎?  
  未改變,值還是5,這說明,Clone後,值型別也複製出來,放到記憶體堆疊。

Check下引用型別有沒有重新從記憶體堆重新開啟空間,修改xiaoming的聯絡-電話:

 (cloneArr1[0] as Person).description.UpdateTelephone("170444455555");
登入後複製

  這個時候,我們再Check,初始集合arr1中xiaoming的聯絡方式改變了嗎?
   答案:改變了,和最新的170444455555一致。
 這說明了對引用類型,淺表副本複製,只是複製引用,而未重新再記憶體堆中開闢記憶體空間。 (如果您對記憶體堆,記憶體棧,概念不是很清楚,請參考我總結的:C#.NET:記憶體管理story-變數建立與銷毀)。

  至此,我們對Clone的功能有了一個全新的認識了!淺表副本,引用類型只複製引用,不複製物件。 !

  那麼如果說,我想實現了深度複製呢,也就是我新複製出來的物件不是僅僅複製引用, 而是複製物件!比如說,你需要在一個模板的基礎上修改出5個版本的建立,每個版本投遞到不同的企業上,版本1投給公司A,版本2投給公司B,。 。 。假如說這5個版本的不同只是“我期望加入某某公司”,某某換成5個公司對應的名稱。

以上是.NET架構-Clone詳請介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!