引用類型的賦值、淺拷貝和深拷貝的區別

ICloneable 接口:支持克隆,即用與現有實例相同的值創建類的新實例。

MemberwiseClone 方法:創建當前 System.Object 的淺表副本。

淺拷貝:給對象拷貝一份新的對象。

淺拷貝的定義 —— 只對值類型(或string)類型分配新的內存地址。

深拷貝:給對象拷貝一份全新的對象。

深拷貝的定義 —— 對值類型分配新的內存地址,引用類型、以及引用類型的內部字段分配的新的地址。

注意:

1、在 .NET 程序中,應該避免使用 ICloneable 接口。

      因爲通過該接口無法判斷究竟是淺拷貝還是深拷貝,這會造成誤解或誤用。

 

2、深拷貝應該複製該對象本身及通過該對象所能到達的完整的對象圖,淺拷貝只複製對象本身(就是該對象所表示的在堆中的一塊連續地址中的內容)。


 [Serializable]
    public class Person : ICloneable
    {
        public int Age { get; set; }
        public string Address { get; set; }
        public Name Name { get; set; }
        /*
        public object Clone()  //淺拷貝
        {
            return this.MemberwiseClone();
        }
        */
        public object Clone() //深度拷貝
        {
            using (MemoryStream ms = new MemoryStream(1000))
            {
                object CloneObject;
                BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
                bf.Serialize(ms, this);
                ms.Seek(0, SeekOrigin.Begin);
                // 反序列化至另一個對象(即創建了一個原對象的深表副本) 
                CloneObject = bf.Deserialize(ms);
                // 關閉流 
                ms.Close();
                return CloneObject;
            }
        }
    }

    [Serializable]
    public class Name
    {
        public Name(string frisName, string lastName)
        {
            FristName = frisName;
            LastName = lastName;
        }
        public string FristName { get; set; }
        public string LastName { get; set; }
    }





http://www.cnblogs.com/jhxk/articles/1911564.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章