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