引用型別的賦值、淺拷貝和深拷貝的區別
阿新 • • 發佈:2019-01-29
ICloneable 介面:支援克隆,即用與現有例項相同的值建立類的新例項。
MemberwiseClone 方法:建立當前 System.Object 的淺表副本。
淺拷貝:給物件拷貝一份新的物件。
淺拷貝的定義 —— 只對值型別(或string)型別分配新的記憶體地址。
深拷貝:給物件拷貝一份全新的物件。
深拷貝的定義 —— 對值型別分配新的記憶體地址,引用型別、以及引用型別的內部欄位分配的新的地址。
注意:
1、在 .NET 程式中,應該避免使用 ICloneable 介面。
因為通過該介面無法判斷究竟是淺拷貝還是深拷貝,這會造成誤解或誤用。
2、深拷貝應該複製該物件本身及通過該物件所能到達的完整的物件圖,淺拷貝只複製物件本身(就是該物件所表示的在堆中的一塊連續地址中的內容)。
http://www.cnblogs.com/jhxk/articles/1911564.html[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; } }