官术网_书友最值得收藏!

2.6 裝箱和拆箱

裝箱和拆箱是一個抽象的概念,通過裝箱和拆箱的功能,可以允許值類型的任何值與Object類型的值相互轉(zhuǎn)換,將值類型和引用類型連接起來。

2.6.1 裝箱

裝箱是值類型到Object類型或到此值類型所實現(xiàn)的任何接口類型的隱式轉(zhuǎn)換,用于在垃圾回收堆中存儲值類型。

裝箱實際上是指將值類型轉(zhuǎn)換為引用類型的過程,裝箱的執(zhí)行過程大致可以分為以下三個階段:

(1)從托管堆中為新生成的引用對象分配內(nèi)存。

(2)將值類型的實例字段拷貝到新分配的內(nèi)存中。

(3)返回托管堆中新分配對象的地址,該地址就是一個指向?qū)ο蟮囊昧恕?/p>

如下代碼演示了如果將int類型的變量val進行裝箱操作,然后將裝箱后的值進行輸出:

int val = 100;
object obj = val;                            //裝箱
Console.WriteLine (“對象的值 = {0}", obj);   //輸出結(jié)果

裝箱操作生成的是全新的引用對象,這會損耗一部分的時間,因此會造成效率的降低,所以應(yīng)該盡量避免裝箱操作。一般情況下,符合下面的情況時可以實施裝箱操作:

□ 調(diào)用一個含Object類型的參數(shù)方法時,該Object可以支持任意的類型以方便通用,當(dāng)開發(fā)人員需要將一個值類型(如Int32)傳入時就需要裝箱。

□ 使用一個非泛型的容器,其目的是為了保證能夠通用。因此可以將元素類型定義為Object,于是如果要將值類型數(shù)據(jù)加入容器時需要裝箱。

2.6.2 拆箱

拆箱也叫取消裝箱,它是與裝箱相反的操作,它是從Object類型到值類型或從接口類型到實現(xiàn)該接口的值類型的顯式轉(zhuǎn)換。

拆箱實際上是指從引用類型到值類型的過程,拆箱的執(zhí)行過程大致可以分為以下兩個階段:

(1)檢查對象實例,確保它是給定值類型的一個裝箱值。

(2)將該值從實例復(fù)制到值類型變量中。

如下示例代碼演示了基本的拆箱操作:

int val = 100;
object obj = val;                      //裝箱
int num = (int) obj;                   //拆箱
Console.WriteLine ("num: {0}", num);   //輸出結(jié)果

注意

當(dāng)一個裝箱操作把值類型轉(zhuǎn)換成一個引用類型時,不需要顯式地強制類型轉(zhuǎn)換;而拆箱操作把引用類型轉(zhuǎn)換到值類型時,由于它可以強制轉(zhuǎn)換到任何可以相容的值類型,所以必須顯式地強制類型轉(zhuǎn)換。

主站蜘蛛池模板: 中阳县| 玉树县| 商河县| 孟村| 封丘县| 大姚县| 额尔古纳市| 大石桥市| 弥勒县| 五莲县| 宣化县| 拜泉县| 上蔡县| 贡觉县| 冀州市| 泰州市| 兴安县| 华宁县| 若尔盖县| 额尔古纳市| 佳木斯市| 嵊泗县| 辉南县| 鄱阳县| 绥棱县| 连城县| 巴楚县| 青铜峡市| 城步| 万盛区| 阳信县| 浙江省| 会宁县| 晴隆县| 呼图壁县| 淮滨县| 巩义市| 姜堰市| 垫江县| 大港区| 竹山县|