程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 淺析C#深拷貝與淺拷貝

淺析C#深拷貝與淺拷貝

編輯:C#入門知識

 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();
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved