自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

CLR Via C#教程之裝箱和拆箱講述

開發(fā) 后端
CLR Via C#教程詳述了裝箱和拆箱兩個概念,裝箱:將值類型轉(zhuǎn)換為引用類型,拆箱:將引用類型轉(zhuǎn)換為值類型。希望對大家有幫助。

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

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

  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);//對p進(jìn)行裝箱后,將引用添加到list中  
  11. }  
  12. }  
  13. }  
  14. struct  Point  
  15. {  
  16. public Int32 x;  
  17. public Int32 y;  
  18. }ArrayList的Add方法是接受一個Object參數(shù),如下   
  19. public virtual int Add(object value);  

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


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


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

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


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

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

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

正確的做法是,現(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);  

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

【編輯推薦】

  1. 圖文講解.NET CLR是什么
  2. 使用CLR存儲過程來傳回訊息實(shí)戰(zhàn)案例
  3. Visual Studio中SQL SERVER CLR代碼調(diào)試工具使用講解
  4. 全面概括SQL SERVER調(diào)用CLR類庫實(shí)現(xiàn)步驟
  5. CLR函數(shù)實(shí)現(xiàn)字符串排序七步通
責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-08-26 03:39:00

C#裝箱和拆箱

2009-09-01 17:51:47

C#拆箱C#裝箱

2009-08-28 11:22:11

C#裝箱和拆箱

2009-08-06 15:40:11

C#裝箱和拆箱

2021-09-06 14:30:34

C#裝箱拆箱

2009-10-22 18:41:49

CLR VIA C#教

2009-09-18 09:02:45

CLR Via C#

2012-03-26 11:32:45

Java

2009-10-23 11:31:05

CLR Via C#調(diào)

2015-09-02 10:12:54

Java自動裝箱拆箱

2020-11-02 13:06:42

Java裝箱拆箱

2009-09-17 18:56:22

CLR Via C#

2009-09-27 11:14:09

C#數(shù)組

2009-09-18 10:18:30

CLR Via

2009-09-18 09:59:39

C# CLR

2009-09-27 10:46:30

C#控件數(shù)組

2009-09-18 09:35:36

C# CLR

2009-05-22 10:18:44

C指針OO

2009-08-11 15:17:12

C#基礎(chǔ)知識

2009-09-14 18:34:32

C# List排序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號