国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET 中的裝箱與拆箱實現過程

2024-07-10 12:41:03
字體:
來源:轉載
供稿:網友

先看下面的代碼:
代碼如下:
int tempi = 1;
object o = tempi;
double tempd = (double) o;

編譯時可以通過,但運行時卻報如下錯誤:
System.InvalidCastException: 指定的轉換無效。

這是因為,當對一個對象進行拆箱時,轉型的結果必須是它原來未裝箱的類型。此處必須先轉換為int類型,才能再轉換為double類型。其正確格式如下:
代碼如下:
int tempi = 32;
object o = tempi;
double tempd = (double)(int) o;

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 含山县| 晴隆县| 德格县| 石林| 阳城县| 车险| 麟游县| 崇阳县| 海丰县| 新乡市| 阳曲县| 衡山县| 门头沟区| 托里县| 南昌县| 平和县| 韶山市| 如东县| 磐安县| 石狮市| 保亭| 马尔康县| 甘谷县| 那坡县| 霸州市| 庆元县| 靖西县| 容城县| 仁化县| 乌海市| 文成县| 阿克苏市| 沁水县| 桦南县| 通州市| 南华县| 如东县| 石林| 宝兴县| 黄陵县| 海安县|