1. 程式人生 > >引用型別的賦值、淺拷貝和深拷貝的區別

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

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