Clone,浅拷贝,它的实现就是把要拷贝的对象的值,一一的赋值给要拷贝的对象。这里要注意:一一赋值。如果是堆对象,其实就是类似于C语言中的指针拷贝。
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;

}
}
Copy,深拷贝,它的实现是把自己拥有的东西,重新Create一份,交给要Copy的对象。这样它们就具有了2份一样的财富。 彼此之间除了量上相等意外,没有其他联系。





























































































