.net copy与clone的用法

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

        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田猿笔记

写文章不容易,希望大家小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值