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; }
}