日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

深拷貝與淺拷貝探析

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

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

考慮以下寫法

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

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

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

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

       首先(2)中將source賦給dest,執(zhí)行了深拷貝動(dòng)作,其時(shí)destsource的值是一樣的,都是int.MaxValue;(3)對(duì)dest進(jìn)行修改,dest值變?yōu)?/span>1024,由于是深拷貝,因此不會(huì)運(yùn)行sourcesource仍然是int.MaxValue;(4)對(duì)source進(jìn)行了修改,同樣道理,dest仍然是1024,同時(shí)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.         淺拷貝是指源對(duì)象與拷貝對(duì)象共用一份實(shí)體,僅僅是引用的變量不同(名稱不同)。對(duì)其中任何一個(gè)對(duì)象的改動(dòng)都會(huì)影響另外一個(gè)對(duì)象。舉個(gè)例子,一個(gè)人一開(kāi)始叫張三,后來(lái)改名叫李四了,可是還是同一個(gè)人,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個(gè)人倒霉。比較典型的就有Reference(引用)對(duì)象,如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)在是引用對(duì)象,因此Point dest=source的賦值動(dòng)作實(shí)際上執(zhí)行的是淺拷貝,最后的結(jié)果應(yīng)該是sourceX字段值也變成了20。即它們引用了同一個(gè)對(duì)象,僅僅是變量明sourcedest不同而已。

3.         引用對(duì)象的淺拷貝原理

引用對(duì)象之間的賦值之所以執(zhí)行的是淺拷貝動(dòng)作,與引用對(duì)象的特性有關(guān),一個(gè)引用對(duì)象一般來(lái)說(shuō)由兩個(gè)部分組成

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

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

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

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

由于引用對(duì)象的賦值僅僅是復(fù)制具名Handle(變量)指向的地址,因此要對(duì)引用對(duì)象進(jìn)行深拷貝就要重新創(chuàng)建一份該對(duì)象的實(shí)例,并對(duì)該對(duì)象的字段進(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

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

 

5.一些需要注意的東西

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

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多