程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .net copy與clone的用法

.net copy與clone的用法

編輯:.NET實例教程
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;

        }
    }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved