乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深拷貝與淺拷貝探析

       職業(yè)醬油仔 2013-05-14

                                                          深拷貝與淺拷貝探析
      1.         深拷貝是指源對象與拷貝對象互相獨(dú)立,其中任何一個對象的改動都不會對另外一個對象造成影響。舉個例子,一個人名叫張三,后來用他克?。僭O(shè)法律允許)了另外一個人,叫李四,不管是張三缺胳膊少腿還是李四缺胳膊少腿都不會影響另外一個人。比較典型的就是Value(值)對象,如預(yù)定義類型Int32Double,以及結(jié)構(gòu)(struct),枚舉(Enum)等。

      考慮以下寫法

             int source = int.MaxValue;//(1)初始化源對象為整數(shù)的最大值2,147,483,647

                  int dest = source;//(2)賦值,內(nèi)部執(zhí)行深拷貝

                  dest = 1024;//(3)對拷貝對象進(jìn)行賦值

                  source = 2048;//(4)對源對象進(jìn)行賦值

             首先(2)中將source賦給dest,執(zhí)行了深拷貝動作,其時destsource的值是一樣的,都是int.MaxValue;(3)對dest進(jìn)行修改,dest值變?yōu)?/span>1024,由于是深拷貝,因此不會運(yùn)行source,source仍然是int.MaxValue;(4)對source進(jìn)行了修改,同樣道理,dest仍然是1024,同時int.MaxValue的值也不變,仍然是2,147,483,647;只有source變成了2048。

             再考慮以下寫法

              struct Point

              {

                  public int X;

                  public int Y;

                  public Point(int x, int y)

                  {

                      X = x;

                      Y = y;

                  }

              }

       

              Point source = new Point(10, 20);

              Point dest = source;

       

              dest.X = 20

           當(dāng)dest.X屬性變成20后,sourceX屬性仍然是10

      2.         淺拷貝是指源對象與拷貝對象共用一份實(shí)體,僅僅是引用的變量不同(名稱不同)。對其中任何一個對象的改動都會影響另外一個對象。舉個例子,一個人一開始叫張三,后來改名叫李四了,可是還是同一個人,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個人倒霉。比較典型的就有Reference(引用)對象,如Class(類)。

      考慮以下寫法

              class Point

              {

                  public int X;

                  public int Y;

                  public Point(int x, int y)

                  {

                      X = x;

                      Y = y;

                  }

              }

       

              Point source = new Point(10, 20);

              Point dest = source;

         dest.X = 20;

      由于Point現(xiàn)在是引用對象,因此Point dest=source的賦值動作實(shí)際上執(zhí)行的是淺拷貝,最后的結(jié)果應(yīng)該是sourceX字段值也變成了20。即它們引用了同一個對象,僅僅是變量明sourcedest不同而已。

      3.         引用對象的淺拷貝原理

      引用對象之間的賦值之所以執(zhí)行的是淺拷貝動作,與引用對象的特性有關(guān),一個引用對象一般來說由兩個部分組成

      1)一個具名的Handle,也就是我們所說的聲明(如變量)

      2)一個內(nèi)部(不具名)的對象,也就是具名Handle的內(nèi)部對象。它在Manged Heap(托管堆)中分配,一般由新增引用對象的New方法是進(jìn)行創(chuàng)建

             如果這個內(nèi)部對象已被創(chuàng)建,那么具名的Handle就指向這個內(nèi)部對象在Manged Heap中的地址,否則就是null(從某個方面來講,如果這個具名的handle可以被賦值為null,說明這是一個引用對象,當(dāng)然不是絕對)。兩個引用對象如果進(jìn)行賦值,它們僅僅是復(fù)制這個內(nèi)部對象的地址,內(nèi)部對象仍然是同一個,因此,源對象或拷貝對象的修改都會影響對方。這也就是淺拷貝

      4.         引用對象如何進(jìn)行深拷貝

      由于引用對象的賦值僅僅是復(fù)制具名Handle(變量)指向的地址,因此要對引用對象進(jìn)行深拷貝就要重新創(chuàng)建一份該對象的實(shí)例,并對該對象的字段進(jìn)行逐一賦值,如以下寫法

              class Point

              {

                  public int X;

                  public int Y;

                  public Point(int x, int y)

                  {

                      X = x;

                      Y = y;

                  }

              }

       

              Point source = new Point(10, 20);

              Point dest = new Point(source.X, source.Y);

              //或以下寫法

              //Point dest = new Point()

              //dest.X = source.X

         //dest.Y = source.Y

             其時,sourcedest就是兩個互相獨(dú)立的對象了,兩者的修改都不會影響對方

       

      5.一些需要注意的東西

             1):String字符串對象是引用對象,但是很特殊,它表現(xiàn)的如值對象一樣,即對它進(jìn)行賦值,分割,合并,并不是對原有的字符串進(jìn)行操作,而是返回一個新的字符串對象

             2):Array數(shù)組對象是引用對象,在進(jìn)行賦值的時候,實(shí)際上返回的是源對象的另一份引用而已;因此如果要對數(shù)組對象進(jìn)行真正的復(fù)制(深拷貝),那么需要新建一份數(shù)組對象,然后將源數(shù)組的值逐一拷貝到目的對象中

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多