主頁(yè) > 知識(shí)庫(kù) > .NET 中的裝箱與拆箱實(shí)現(xiàn)過程

.NET 中的裝箱與拆箱實(shí)現(xiàn)過程

熱門標(biāo)簽:玉林市機(jī)器人外呼系統(tǒng)哪家好 同安公安400電話怎么申請(qǐng)流程 南陽(yáng)外呼系統(tǒng)定制化 申請(qǐng)400電話手續(xù) 蘋果手機(jī)凱立德地圖標(biāo)注 預(yù)測(cè)式外呼系統(tǒng)使用說明 百度ai地圖標(biāo)注 電話機(jī)器人軟件銷售工作 合肥電銷外呼系統(tǒng)哪家公司做的好

先看下面的代碼:

復(fù)制代碼 代碼如下:

int tempi = 1;
object o = tempi;
double tempd = (double) o;

編譯時(shí)可以通過,但運(yùn)行時(shí)卻報(bào)如下錯(cuò)誤:
System.InvalidCastException: 指定的轉(zhuǎn)換無效。

這是因?yàn)?,?dāng)對(duì)一個(gè)對(duì)象進(jìn)行拆箱時(shí),轉(zhuǎn)型的結(jié)果必須是它原來未裝箱的類型。此處必須先轉(zhuǎn)換為int類型,才能再轉(zhuǎn)換為double類型。其正確格式如下:
復(fù)制代碼 代碼如下:

int tempi = 32;
object o = tempi;
double tempd = (double)(int) o;

在.NET框架中,裝箱(boxing)通常由以下三步組成
1.從托管堆中為新生成的引用類型對(duì)象分配內(nèi)存。分配的內(nèi)存大小為被裝箱的值類型實(shí)例本身的大小,再加上為新生成的引用類型添加的一個(gè)方法表指針和一個(gè)SyncBlockIndex。
2.將值類型實(shí)例的字段拷貝到托管堆上新分配對(duì)象的內(nèi)存中。
3.返回托管堆中新分配對(duì)象的地址。這樣值類型實(shí)例也變成了一個(gè)引用類型對(duì)象。

而拆箱(unboxing)過程則如下
1.如果要拆箱的對(duì)象為null,將會(huì)拋出一個(gè)NullReferenceException異常。
2.如果該引用指向的對(duì)象不是一個(gè)期望的值類型的已裝箱對(duì)象,則拆箱失敗,并拋出一個(gè)InvalidCastException異常(如本文剛開始的部分)。
3.一個(gè)指向包含在已經(jīng)裝箱對(duì)象中值類型部分的指針被返回。該指針指向的值類型對(duì)于引用類型對(duì)象通常所具有的附加成員(即一個(gè)方法表指針和一個(gè)SyncBlockIndex)一無所知。實(shí)際上,該指針指向的是已經(jīng)裝箱對(duì)象中的未裝箱部分(Microsoft.NET 框架程序設(shè)計(jì)修訂版>)。

對(duì)于第3點(diǎn),可以使用上面的例子來幫助理解。首先定義值類型變量tempi,它在內(nèi)存中占用4個(gè)字節(jié),裝箱之后,其變成引用對(duì)象的同時(shí),增加了一個(gè)方法表指針和一個(gè)SyncBlockIndex。對(duì)于引用類型而言,只需要傳一個(gè)“引用類型”的地址,就可以得到其值、方法表指針和SyncBlockIndex。在拆箱時(shí),傳遞的是其“值”的地址(未裝箱的部分),即一個(gè)“int(Int32)類型”的地址(引用),它只允許讀4個(gè)字節(jié)。而double類型是8個(gè)字節(jié),因此隱式的轉(zhuǎn)換是會(huì)報(bào)錯(cuò)的,需要先將其轉(zhuǎn)換成int類型后,才能再轉(zhuǎn)換為double類型。

您可能感興趣的文章:
  • Java中的裝箱和拆箱深入理解
  • 淺談Java自動(dòng)裝箱與拆箱及其陷阱
  • java自動(dòng)裝箱拆箱深入剖析
  • 再議C#中的裝箱與拆箱的問題詳解
  • 解析C#中的裝箱與拆箱的詳解
  • C#實(shí)現(xiàn)裝箱與拆箱操作簡(jiǎn)單實(shí)例
  • c#裝箱和拆箱知識(shí)整理
  • C#裝箱和拆箱原理詳解
  • 輕松學(xué)習(xí)C#的裝箱與拆箱
  • Java拆裝箱深度剖析

標(biāo)簽:海南 南京 揚(yáng)州 淄博 南京 臺(tái)州 南昌 嘉興

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.NET 中的裝箱與拆箱實(shí)現(xiàn)過程》,本文關(guān)鍵詞  .NET,中的,裝箱,與,拆箱,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《.NET 中的裝箱與拆箱實(shí)現(xiàn)過程》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于.NET 中的裝箱與拆箱實(shí)現(xiàn)過程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章