淺拷貝和深拷貝之間的區別: 淺拷貝是指將對象中的數值類型的欄位拷貝到新的對象中,而對象中的引用型欄位則指複製它的一個引用到目標對象。如果改變目標對象中引用型欄位的值他將反映在原始對象中,也就是說原始對象中對應的欄位也會發生變化。 深拷貝與淺拷貝不同的是對於引用的處理,深拷貝將會在新對象中創建一個新的 ...
淺拷貝和深拷貝之間的區別:
淺拷貝是指將對象中的數值類型的欄位拷貝到新的對象中,而對象中的引用型欄位則指複製它的一個引用到目標對象。如果改變目標對象中引用型欄位的值他將反映在原始對象中,也就是說原始對象中對應的欄位也會發生變化。
深拷貝與淺拷貝不同的是對於引用的處理,深拷貝將會在新對象中創建一個新的和原始對象中對應欄位相同(內容相同)的欄位,也就是說這個引用和原始對象的引用是不同的,我們在改變新對象中的這個欄位的時候是不會影響到原始對象中對應欄位的內容。
所以對於原型模式(prototype pattern)也有不同的兩種處理方法:對象的淺拷貝和深拷貝
MemberwiseClone 方法創建一個淺表副本,方法是創建一個新對象,然後將當前對象的非靜態欄位複製到該新對象。如果欄位是值類型的,則對該欄位執行逐位複製。如果欄位是引用類型,則複製引用但不複製引用的對象;因此,原始對象及其複本引用同一對象。深拷貝,即實現ICloneable介面.ICloneable可用於深拷貝和淺拷貝。
.net提供了一個ICloneable介面,該介面下有一個Clone()方法,你可以實現它用來實現你自己的克隆方式,比如深克隆或是淺克隆,MemberwiseClone()是object類中的一個方法,用來實現類的淺克隆
下麵是一個深拷貝與淺拷貝的Model,僅供參考
[Serializable] public class InvoiceDetailResponse : IDeepCopy, IShallowCopy { public Guid merchant_id { get; set; } /// <summary> /// 名稱 /// </summary> public string uname { get; set; } /// <summary> /// 淺拷貝 /// </summary> /// <returns></returns> public object ShallowCopy() { return this.MemberwiseClone(); } /// <summary> /// 深拷貝 /// </summary> /// <returns></returns> public object DeepCopy() { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter bFormatter = new BinaryFormatter(); bFormatter.Serialize(stream, this); stream.Seek(0, SeekOrigin.Begin); return (InvoiceDetailResponse)bFormatter.Deserialize(stream); } } } /// <summary> /// 深拷貝介面 /// </summary> interface IDeepCopy { object DeepCopy(); } /// <summary> /// 淺拷貝介面 /// </summary> interface IShallowCopy { object ShallowCopy(); }