日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
CLRViaC#教程之裝箱和拆箱講述

CLR Via C#教程教你裝箱和拆箱, 學(xué)了并將看過的部分寫出來,因?yàn)閷懙倪^程也是一個(gè)加深理解的過程。本系列算是學(xué)習(xí)的一個(gè)記錄吧,也可以方便以后自己查閱,如果對(duì)大家還有些幫助的話,我就很高興了。書我是選擇性的看的,所以順序和書中的順序可能不一樣。

南關(guān)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),南關(guān)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為南關(guān)上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的南關(guān)做網(wǎng)站的公司定做!

CLR Via C#教程裝箱和拆箱是已經(jīng)被嚼爛的兩個(gè)概念了,并且在一些面試中也經(jīng)常考到。
裝箱:將值類型轉(zhuǎn)換為引用類型。
拆箱:將引用類型轉(zhuǎn)換為值類型。
值類型是一種相對(duì)輕型的類型,不像對(duì)象那樣在托管堆中分配,也不會(huì)被GC,不通過指針來引用,不過在有些時(shí)候需要獲取對(duì)值類型的引用,例如在使用net1.0的集合類ArrayList的時(shí)候。

 
 
 
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. ArrayList list = new ArrayList();
  6. Point p;//因Point為值類型,分配在堆棧中
  7. for (int i = 0; i < 100; i++)
  8. {
  9. pp.x = p.y = i;  //初始化Point中的成員
  10. list.Add(p);//對(duì)p進(jìn)行裝箱后,將引用添加到list中
  11. }
  12. }
  13. }
  14. struct  Point
  15. {
  16. public Int32 x;
  17. public Int32 y;
  18. }ArrayList的Add方法是接受一個(gè)Object參數(shù),如下 
  19. public virtual int Add(object value);

所以在執(zhí)行Add方法時(shí)會(huì)將Point值類型轉(zhuǎn)換為一個(gè)堆得托管對(duì)象,并獲取到這個(gè)對(duì)象的引用,將引用地址存儲(chǔ)在ArrayList中。

在一個(gè)值類型裝箱的時(shí)候內(nèi)部發(fā)生的事情:
l 在托管堆分配好內(nèi)存。分配的內(nèi)存是值類型的各個(gè)字段所需內(nèi)存量加上托管堆上的兩個(gè)額外成員(類型對(duì)象指針和同步索引塊)所需的內(nèi)存量。
l 值類型中的字段值復(fù)制到新分配的堆內(nèi)存中。
l 返回對(duì)象的引用地址。

拆箱就是執(zhí)行和裝箱相反的操作,將引用類型轉(zhuǎn)化為值類型。接上面的代碼,獲取ArrayList中的元素值用如下代碼:

 
 
 
  1. for (int j = 0; j < 10; j++)
  2. Point point =(Point)list[j];
  3. Console.WriteLine("X:" + point.x + " Y:" + point.y);
  4. }

上面的代碼中通過索引取到ArrayList中存儲(chǔ)的各個(gè)Point的引用地址,通過Point類型轉(zhuǎn)換將其對(duì)應(yīng)的值從堆中復(fù)制到Point的實(shí)例point中,這個(gè)轉(zhuǎn)換的過程就是拆箱的過程。

在拆箱的過程中要注意以下兩點(diǎn):
1. 如果對(duì)已裝箱的值類型的引用的變量為null,會(huì)引發(fā)NullRefreenceException異常
2. 如果一個(gè)引用指向的對(duì)象在拆箱時(shí)不是用的裝箱時(shí)所使用的類型,將會(huì)引發(fā)InvalidCastException異常。代碼如下:

 
 
 
  1. static void Main(string[] args)
  2. {
  3. Int32 x = 5;
  4. Object o = x;
  5. Int16 y = (Int16)o;//引發(fā)InvalidCastException異常
  6. }

正確的做法是,現(xiàn)將其用Int32類型來拆箱,然后再強(qiáng)制轉(zhuǎn)換為Int16

 
 
 
  1. static void Main(string[] args)
  2. {
  3. Int32 x = 5;
  4. Object o = x;
  5. Int16 y = (Int16)(Int32)o;
  6. }

下面來看兩段程序來深入理解下裝箱和拆箱

代碼一:

 
 
 
  1. static void Main(string[] args)
  2. {
  3. Int32 x = 5;
  4. Object o = x;
  5. x = 123;
  6. Console.WriteLine(x + ",  " + (Int32)o);
  7. }

上面的代碼中有多少次裝箱呢?乍一看好像就一次(Object o=x;),其實(shí)一共有三次裝箱,看看IL代碼就一目了然了,以上就是CLR Via C#教程之一。


網(wǎng)頁名稱:CLRViaC#教程之裝箱和拆箱講述
轉(zhuǎn)載源于:http://m.5511xx.com/article/djjjpgo.html