.NET 中的裝箱與拆箱實現(xiàn)過程
更新時間:2013年01月10日 12:02:01 作者:
本文分別介紹裝箱(boxing)與拆箱(unboxing)的實現(xiàn)過程,感興趣的朋友可以了解下
先看下面的代碼:
復(fù)制代碼 代碼如下:
int tempi = 1;
object o = tempi;
double tempd = (double) o;
編譯時可以通過,但運行時卻報如下錯誤:
System.InvalidCastException: 指定的轉(zhuǎn)換無效。
這是因為,當(dāng)對一個對象進行拆箱時,轉(zhuǎn)型的結(jié)果必須是它原來未裝箱的類型。此處必須先轉(zhuǎn)換為int類型,才能再轉(zhuǎn)換為double類型。其正確格式如下:
復(fù)制代碼 代碼如下:
int tempi = 32;
object o = tempi;
double tempd = (double)(int) o;
在.NET框架中,裝箱(boxing)通常由以下三步組成:
1.從托管堆中為新生成的引用類型對象分配內(nèi)存。分配的內(nèi)存大小為被裝箱的值類型實例本身的大小,再加上為新生成的引用類型添加的一個方法表指針和一個SyncBlockIndex。
2.將值類型實例的字段拷貝到托管堆上新分配對象的內(nèi)存中。
3.返回托管堆中新分配對象的地址。這樣值類型實例也變成了一個引用類型對象。
而拆箱(unboxing)過程則如下:
1.如果要拆箱的對象為null,將會拋出一個NullReferenceException異常。
2.如果該引用指向的對象不是一個期望的值類型的已裝箱對象,則拆箱失敗,并拋出一個InvalidCastException異常(如本文剛開始的部分)。
3.一個指向包含在已經(jīng)裝箱對象中值類型部分的指針被返回。該指針指向的值類型對于引用類型對象通常所具有的附加成員(即一個方法表指針和一個SyncBlockIndex)一無所知。實際上,該指針指向的是已經(jīng)裝箱對象中的未裝箱部分(Microsoft.NET 框架程序設(shè)計<修訂版>)。
對于第3點,可以使用上面的例子來幫助理解。首先定義值類型變量tempi,它在內(nèi)存中占用4個字節(jié),裝箱之后,其變成引用對象的同時,增加了一個方法表指針和一個SyncBlockIndex。對于引用類型而言,只需要傳一個“引用類型”的地址,就可以得到其值、方法表指針和SyncBlockIndex。在拆箱時,傳遞的是其“值”的地址(未裝箱的部分),即一個“int(Int32)類型”的地址(引用),它只允許讀4個字節(jié)。而double類型是8個字節(jié),因此隱式的轉(zhuǎn)換是會報錯的,需要先將其轉(zhuǎn)換成int類型后,才能再轉(zhuǎn)換為double類型。
相關(guān)文章
.NET CORE3.1實現(xiàn)微信小程序發(fā)送訂閱消息
這篇文章主要介紹了.NET CORE3.1實現(xiàn)微信小程序發(fā)送訂閱消息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Asp.net中使用PageDataSource分頁實現(xiàn)代碼
這篇文章主要介紹asp.net中使用PageDataSource分頁的方法,需要的朋友可以參考下2013-04-04
運用.NetCore實例講解RabbitMQ死信隊列,延時隊列
這篇文章主要運用.NetCore實例講解RabbitMQ死信隊列,延時隊列,,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-09-09
asp.net(c#)ref,out ,params的區(qū)別
C#中有三個關(guān)鍵字-ref,out ,params,雖然本人不喜歡這三個關(guān)鍵字,因為它們疑似破壞面向?qū)ο筇匦?。但是既然m$把融入在c#體系中,那么我們就來認識一下參數(shù)修飾符ref,out ,params吧,還有它們的區(qū)別。2009-12-12
.Net插件框架Managed Extensibility Framework簡介
這篇文章介紹了.Net插件框架Managed Extensibility Framework,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
asp.net頁面SqlCacheDependency緩存實例
這篇文章主要介紹了asp.net頁面SqlCacheDependency緩存實例,以一個完整實例來展現(xiàn)asp.net中緩存技術(shù)的使用方法,需要的朋友可以參考下2014-08-08

