Clone,淺拷貝,它的實現就是把要拷貝的對象的值,一一的賦值給要拷貝的對象。這裡要注意:一一賦值。如果是堆對象,其實就是類似於C語言中的指針拷貝。
Copy,深拷貝,它的實現是把自己擁有的東西,重新Create一份,交給要Copy的對象。這樣它們就具有了2份一樣的財富。 彼此之間除了量上相等意外,沒有其他聯系。

protected void Page_Load(object sender, EventArgs e)


...{

//clone

//int[]是引用類型而int是值類型。在int[]中使用clone是生成一個新的新的內存塊

//我修改了 ints[0] = 4;但clonesg[0]不會改變,仍為1


int[] ints =...{ 1, 2, 3 };

int[] cloneints = (int[])ints.Clone();

bool b2 = object.Equals(ints, cloneints);

ints[0] = 4;

Response.Write(cloneints[0] + "<br/>");//這個值仍為1


//copy (int[]的copy和clone意義一樣)

int[] copyint=new int[3];

Array.Copy(ints, copyint, ints.Length);

ints[0] = 14;


//-----------------------------------


//string[],string都是引用類型,在string[]使用clone也會生成一個新的內存塊,

//我修改了 sg[0] = "candu";但cloneints[0]不會改變,仍為"df"

string[] sg =...{ "df", "dfsa", "eee", "eee" };

string[] clonesg = (string[])sg.Clone();

bool b1 = object.Equals(sg, clonesg);

sg[0] = "candu";

Response.Write(clonesg[0]);//但clonesg[0]="df"


//---------------------------------------

//注意區別

//object 的引用類型,在penson[] 使用clone不會產生新的內存塊。它是指向同一內存塊。

//我改變ps[0].lastname的值為“changdu”,pa[0].lastname的值也改變

//如果想產生多一個內存塊。那麼一定要重新new。

penson[] ps = new penson[2];

ps[0] = new penson("can", "du");

ps[1] = new penson("echo", "wuang");

penson[] pa = new penson[2];

pa = (penson[])ps.Clone();

bool b = object.Equals(ps, pa);


ps[0].lastname = "changdu";

Response.Write("<br/>" + pa[0].lastname);//ps[0].lastname 改變了,pa[0].lastname也改變,因為它指向同一內存塊


//Array copy也是指向同一內存塊,不能實現產生多一個內存塊

penson[] pcopy = new penson[ps.Length];

Array.Copy(ps, pcopy, ps.Length);

ps[0].lastname = "changecho";

//CopyTo 也是指向同一內存塊,不能實現產生多一個內存塊

penson[] pcopyto = new penson[ps.Length];

ps.CopyTo(pcopyto, 0);

ps[0].lastname = "changecho2";


//如果想產生多一個內存塊。那麼一定要重新new。

//實現copy功能

foreach (penson p in ps)


...{

penson pnew = new penson(p.fistname ,p.lastname);

pnew.fistname = "rain";

}


//---------------------------------

//datatable 的 copy和clone

//copy 包含表結構和數據 ,copy 是一個深度復制。所以會生成多一個對像。存放在不同的內存。

//clone 只包含表結構,沒有數據

Hashtable ht = new Hashtable();

ht.Add("NumberOfPost", 3);

DataTable dt = SqlHelper.getDataTable("GetLatestPosts", ht);

DataTable dtclone = dt.Clone();

//dtclone.Rows.Count值為3

//dtclone.Rows.Count得到為0,因為它只包含表結構,沒有數據

DataTable dtcopy = dt.Copy();

//dtcopy.Rows.Count值為3



dt.Rows[0]["RegionName"] = "changevalue";

Response.Write(dtcopy.Rows[0]["RegionName"].ToString());//當dt的值改變時。dtcopy不會改變

}


public class penson


...{

public string fistname;

public string lastname;

public penson(string fistname,string lastname)


...{

this.fistname = fistname;

this.lastname = lastname;


}

}