1.深拷貝與淺拷貝
拷貝即是通常所說的復制(Copy)或克隆(Clone),對象的拷貝也就是從現有對象復制一個“一模一樣”的新對象出來。雖然都是復制對象,但是不同的復制方法,復制出來的新對象卻並非完全一模一樣,對象內部存在著一些差異。通常的拷貝方法有兩種,即深拷貝和淺拷貝,那二者之間有何區別呢?MSDN裡對IClone接口的Clone方法有這樣的說明:在深層副本中,所有的對象都是重復的;而在淺表副本中,只有頂級對象是重復的,並且頂級以下的對象包含引用。可以看出,深拷貝和淺拷貝之間的區別在於是否復制了子對象。這如何理解呢?下面我通過帶有子對象的代碼來驗證二者的區別。 首先定義兩個類型:Student和ClassRoom,其中Student類型裡包含ClassRoom,並使這兩個類型都分別實現自定義的深拷貝接口(IDeepCopy)和淺拷貝接口(IShallowCopy)。 類圖如下: 定義代碼如下: 定義代碼/// <summary>
/// 深拷貝接口
/// </summary>
interface IDeepCopy
{
object DeepCopy();
}
/// <summary>
/// 淺拷貝接口
/// </summary>
interface IShallowCopy
{
object ShallowCopy();
}
/// <summary>
/// 教室信息
/// </summary>
class ClassRoom : IDeepCopy, IShallowCopy
{
public int RoomID = 1;
public string RoomName = "Room1";
public override string ToString()
{
return "RoomID=" + RoomID + " RoomName=" + RoomName;
}
public object DeepCopy()
{
ClassRoom r = new ClassRoom();
r.RoomID = this.RoomID;
r.RoomName = this.RoomName;
return r;
}
public object ShallowCopy()
{
//直接使用內置的淺拷貝方法返回
return this.MemberwiseClone();
}
}
class Student : IDeepCopy, IShallowCopy
{
//為了簡化,使用public 字段
public string Name;
public int Age;
//自定義類型,假設每個Student只擁有一個ClassRoom
public ClassRoom Room = new ClassRoom();