最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

輕松學(xué)習(xí)C#的裝箱與拆箱

 更新時(shí)間:2022年05月06日 14:39:04   作者:丿木呈廣予口貝  
輕松學(xué)習(xí)C#的裝箱與拆箱,在之前的文章簡(jiǎn)單的提到了輕松學(xué)習(xí)C#的裝箱與拆箱,本文帶著大家更加詳細(xì)的介紹輕松學(xué)習(xí)C#的裝箱與拆箱,感興趣的小伙伴們可以參考一下

首先看一看什么是裝箱和拆箱?

簡(jiǎn)單的來(lái)說(shuō):

裝箱就是值類(lèi)型轉(zhuǎn)換為引用類(lèi)型;
拆箱就是引用類(lèi)型轉(zhuǎn)換為值類(lèi)型。

值類(lèi)型,包括原類(lèi)型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚舉 (enum) 、結(jié)構(gòu) (struct)。

引用類(lèi)型包括類(lèi)、數(shù)組、接口、委托、字符串等。

裝箱:值類(lèi)型到引用類(lèi)型或到此值類(lèi)型所實(shí)現(xiàn)的任何接口類(lèi)型的隱式轉(zhuǎn)換

例如: int temp = 3;
          System.Object obj = temp;

其中,temp為值類(lèi)型,在棧中分配;當(dāng)分配obj這個(gè)引用類(lèi)型時(shí),我們需要在堆中分配一個(gè)obj對(duì)象,然后把temp值賦給它,這么一系列的過(guò)程就是裝箱的過(guò)程。

拆箱:從引用類(lèi)型到任意值類(lèi)型的顯式轉(zhuǎn)換。與裝箱不同,拆箱式顯示轉(zhuǎn)換。

例如:int temp = 3;
              System.Object obj = temp;
                  int i = (int) obj;

拆箱過(guò)程中,首先來(lái)確定對(duì)象obj為一個(gè)值類(lèi)型的裝箱值,然后把值賦給值類(lèi)型。

隱式轉(zhuǎn)換總會(huì)成功的情況,不會(huì)拋出異常:

(1)、從派生類(lèi)到基類(lèi);
(2)、從派生接口到基接口;
(3)、從類(lèi)到接口(該類(lèi)實(shí)現(xiàn)了接口);
(4)、從Null到任何類(lèi);

顯式引用轉(zhuǎn)換,以下可能拋出異常,轉(zhuǎn)換不一定成功:

(1)、從基類(lèi)到派生類(lèi);
(2)、從接口到接口(基接口到派生接口或者倆接口沒(méi)有關(guān)系);
(3)、從接口到類(lèi)(該類(lèi)實(shí)現(xiàn)了該接口或該類(lèi)未封閉);
(4)、從類(lèi)到接口(該類(lèi)未實(shí)現(xiàn)該接口且該類(lèi)未封閉);

上面簡(jiǎn)單的介紹了拆箱和裝箱的定義,下面就來(lái)討論一下裝箱和拆箱與堆和棧怎樣使用

其中值類(lèi)型是在棧中分配內(nèi)存,本身的聲明就是一個(gè)初始化的過(guò)程,其不需要進(jìn)行垃圾回收,只要超出所定義的作用范圍會(huì)自動(dòng)釋放內(nèi)存,而引用類(lèi)型則是在堆中分配的,和java一樣,在堆種分配內(nèi)存,而其托管堆進(jìn)行垃圾回收。當(dāng)兩種數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換時(shí)就引出了裝箱/拆箱。

比較裝箱和拆箱的優(yōu)缺點(diǎn)

裝箱和拆箱雖然滿(mǎn)足了兩只類(lèi)型之間的轉(zhuǎn)換。但是從裝箱的過(guò)程中不難看出,每次裝箱時(shí)要在堆中new一個(gè)新的對(duì)象,當(dāng)量特別大是肯定會(huì)大大影響程序的效率。事物總有兩面性,every sword has two sides,事情便簡(jiǎn)單了,性能也下來(lái)了。所以,在應(yīng)用中,我們應(yīng)該盡量避免裝箱操作。

了解了裝箱和拆箱的操作,我們可以清楚的明白:裝箱操作會(huì)導(dǎo)致數(shù)據(jù)在堆和棧上進(jìn)行拷貝,頻繁的裝箱操作會(huì)性能損失。而相比而言拆箱過(guò)程對(duì)性能損耗還是比較小的。

裝箱和拆箱的詳細(xì)步驟

1、裝箱(box)的詳細(xì)步驟:

(1)、在堆上分配一個(gè)內(nèi)存空間,大小等于需要裝箱的值類(lèi)型對(duì)象的大小加上兩個(gè)引用類(lèi)型對(duì)象都擁有的成員:類(lèi)型對(duì)象指針和同步塊引用。
(2)、把堆棧上的值類(lèi)型對(duì)象復(fù)制到堆上新分配的對(duì)象。
(3)、返回一個(gè)指向堆上新對(duì)象的引用,并且存儲(chǔ)到堆棧上被裝箱的那個(gè)值類(lèi)型的對(duì)象里。

這個(gè)步驟不需要程序員自己編寫(xiě),在任何出現(xiàn)裝箱的地方,編譯器會(huì)自動(dòng)加上執(zhí)行以上功能的IL代碼。
所謂的拆箱就是裝箱對(duì)應(yīng)著的概念,但拆箱的過(guò)程和裝箱并不是倒過(guò)來(lái)就是:

2、拆箱(unbox.any)的詳細(xì)步驟

如果為待拆箱對(duì)象為null,拋出NullReferenceException異常。

如果引用指向的不是一個(gè)期望對(duì)象的已裝箱對(duì)象,拋出InvalidCastException異常。

(1)、獲取已裝箱對(duì)象中各個(gè)字段的地址,這個(gè)過(guò)程就是“拆箱”

需要說(shuō)明的是一般拆箱以后會(huì)伴隨著對(duì)象的拷貝,但拷貝操作已經(jīng)不是拆箱的范疇。

下面舉兩個(gè)小的例子來(lái)實(shí)現(xiàn)什么是裝箱、拆箱以及怎樣避免因頻繁的裝箱而耗費(fèi)內(nèi)存
 

(1)、裝箱:   

using System;
    public class Test
    {
          public static void Main(String[] args)
         {
             int i = 10;
             //將值類(lèi)型的i裝箱
             //需要注意的是:這里的裝箱采用的是值的拷貝
             object obj = i;
             //檢驗(yàn)是否裝箱成功了
             if(obj is int)
             {
                Console.WriteLine("數(shù)據(jù)已經(jīng)裝箱!");
             }
             //我們?cè)谶@里更改i的值
             i = 33;
             Console.WriteLine("int i現(xiàn)在的值是:{0}",i);
            Console.WriteLine("int i裝箱的值是:{0}",obj);
        }
     }

(2)、拆箱:

int i = 10;
     object obj = i;
     int j = (int)obj;  
    (3)、避免頻繁的裝箱:
     int i = 10;
     int j = 20;
     int s = 30;
     Console.WriteLine("i的值為{0},j的值為{1},s的值為{2}", i.ToString(), j.ToString(), s.ToString());

以上就是介紹了C#的裝箱與拆箱,思路很清晰,涉及的內(nèi)容很全面,包括裝箱和拆箱的優(yōu)缺點(diǎn)、裝箱和拆箱的步驟等,很適合初學(xué)者進(jìn)行學(xué)習(xí)。

相關(guān)文章

最新評(píng)論

德庆县| 怀远县| 米易县| 龙川县| 台江县| 鄱阳县| 双牌县| 阜南县| 双峰县| 铜陵市| 晋中市| 巴林左旗| 如东县| 嘉祥县| 苏尼特右旗| 遵义县| 修武县| 富阳市| 白银市| 梅河口市| 从江县| 城市| 彰武县| 镇雄县| 太仆寺旗| 金寨县| 靖宇县| 浮山县| 庆安县| 张北县| 喀喇沁旗| 甘南县| 新和县| 开江县| 烟台市| 新余市| 双峰县| 邳州市| 梧州市| 和硕县| 新建县|