欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.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)文章

  • asp .net core靜態(tài)文件資源的深入講解

    asp .net core靜態(tài)文件資源的深入講解

    這篇文章主要給大家介紹了關(guān)于asp .net core靜態(tài)文件資源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • ASP.NET編程獲取網(wǎng)站根目錄方法小結(jié)

    ASP.NET編程獲取網(wǎng)站根目錄方法小結(jié)

    這篇文章主要介紹了ASP.NET編程獲取網(wǎng)站根目錄方法,較為詳細(xì)的分析了ASP.NET針對網(wǎng)站目錄及物理路徑的操作技巧,并給出了實例予以總結(jié),需要的朋友可以參考下
    2015-11-11
  • .NET實現(xiàn)微信公共平臺上傳下載多媒體文件

    .NET實現(xiàn)微信公共平臺上傳下載多媒體文件

    這篇文章主要介紹了.NET實現(xiàn)微信公共平臺上傳下載多媒體文件的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Asp.net中獲取DataTable選擇第一行某一列值

    Asp.net中獲取DataTable選擇第一行某一列值

    這篇文章主要介紹了獲取DataTable選擇第一行某一列值,需要的朋友可以參考下
    2017-03-03
  • Javascript 直接調(diào)用服務(wù)器C#代碼 ASP.NET Ajax實例

    Javascript 直接調(diào)用服務(wù)器C#代碼 ASP.NET Ajax實例

    近來總有一些朋友會問到一些入門的問題,把這些問題整理一下,寫出來。在以前的文章里,曾經(jīng)利用純JS編寫過Ajax引擎,在真正開發(fā)的時候,大家都不喜歡以這種低效率的方式開發(fā),利用MS Ajax的集成的引擎,可以簡單不少工作。
    2010-03-03
  • window.showModalDialog兩次加載問題清除緩存方法

    window.showModalDialog兩次加載問題清除緩存方法

    window.showModalDialog兩次加載問題:你第一次打開窗口后,第二次瀏覽器沒有從服務(wù)器端取數(shù)據(jù),而直接找到了你已經(jīng)下載的文件
    2013-08-08
  • 1個文件如何輕松搞定Asp.net core 3.1動態(tài)頁面轉(zhuǎn)靜態(tài)頁面

    1個文件如何輕松搞定Asp.net core 3.1動態(tài)頁面轉(zhuǎn)靜態(tài)頁面

    這篇文章主要給大家介紹了關(guān)于如何通過1個文件輕松搞定Asp.net core 3.1動態(tài)頁面轉(zhuǎn)靜態(tài)頁面的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Asp.net core 3.1具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • asp.net更新指定記錄的方法

    asp.net更新指定記錄的方法

    這篇文章主要介紹了asp.net更新指定記錄的方法,涉及針對指定ID調(diào)用update語句的方法,是非常實用的技巧,需要的朋友可以參考下
    2014-11-11
  • WPF實現(xiàn)轉(zhuǎn)圈進度條效果

    WPF實現(xiàn)轉(zhuǎn)圈進度條效果

    這篇文章主要為大家詳細(xì)介紹了WPF實現(xiàn)轉(zhuǎn)圈進度條效果,如何設(shè)計自定義的繞圈進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 淺談ASP.NET常用數(shù)據(jù)綁定控件優(yōu)劣總結(jié)

    淺談ASP.NET常用數(shù)據(jù)綁定控件優(yōu)劣總結(jié)

    這篇文章主要介紹了淺談ASP.NET常用數(shù)據(jù)綁定控件優(yōu)劣總結(jié),以便在實際的開發(fā)中選用合適的控件進行數(shù)據(jù)綁定,以提高開發(fā)效率。
    2016-12-12

最新評論