要掌握裝箱與拆箱,就必須了解cts及它的特點。
net重要技術和基礎之一的cts(common type system)。顧名思義,cts就是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。.net將整個系統的型別分成兩大類 ——value type 和 reference type。。,多數的oo語言存在這個弱點,原因就是因為他們的原型別沒有共同的基點,於是他們在本質上並不是真正的物件c++更依賴於物件,而非物件導向。.net環境的cts 給我們帶來了方便。第一、cts中的所有東西都是物件;第
二、所有的物件都源自乙個基類——system.object型別。這就是所謂的單根層次結構(singly rooted hierarchy)關於system.object的詳細資料請參考微軟的技術文件。cts value type的乙個最大的特點是它們不能為null,value type的變數總有乙個值。在傳遞value type的變數時,實際傳遞的是變數的值,而非底層物件的「引用」。cts reference type就好像是型別安全的指標,它可以為null。當值為null時,說明沒有引用或型別指向某個物件。宣告乙個引用型別的變數時,被操作的是此變數的引用(位址),而不是資料。
使用這種多型別系統時如何有效的拓展和提高系統的效能?就是今天**的問題,西雅圖人提出了box and unbox的想法。簡言之,裝箱就是將value type轉換為reference type;反之,就是拆箱。
裝箱過程:
第一步將乙個值壓入堆疊;
第二步將引用型別轉換為值型別;
第三步間接將值壓棧;第四步傳值給dubunbox。
**如下:
using system;
namespace box /
static void main(string args)
' and the boxed is ",box1,objbox.tostring());
} } }
開啟ildasm.exe
msil
**如下:
.method private hidebysig static void main(string args) cil managed
' and the unboxed is "
il_0017: stloc.0
il_0018: box [mscorlib]system.double
il_001d: stloc.1
il_001e: callvirt instance string [mscorlib]system.object::tostring()
il_0023: call void [mscorlib]system.console::writeline(string,
object,
object)
il_0028: nop
il_0029: ret
} // end of method boxandunbox::main
當box1被裝箱時所發生的過程:
(1)劃分堆疊記憶體,在堆疊上分配的記憶體 = box1的大小 + objbox及其結構所占用的空間;(2) box1的值(11.222)被複製到新近分配的堆疊中;
(3)將分配給objbox的位址壓棧,此時它指向乙個object型別,即引用型別。
拆箱過程:
裝箱的逆過程。值得注意以下幾點:box time不需要顯式的型別轉換,在unbox時就必須進行型別轉換。因為引用型別的物件可以被轉換為任何型別。電腦和人腦乙個差別的體現就在於此!哈哈!型別轉換不容迴避的將會受到來自cts管理中心的監控——其標準自然是依據規則。
下面這段**:
using system;
namespace unbox /
static void main(string args)
' and the unboxed is ",box2,dubunbox);
} / } }
本段**多加了一行double dubunbox = (double)objbox;
這段**的含義:
第一步將乙個值壓入堆疊;
第二步將引用型別轉換為值型別;
第三步間接將值壓棧;
第四步傳值給dubunbox。
.method private hidebysig static void main(string args) cil managed
' and the unboxed is "
il_001e: ldloc.0
il_001f: box [mscorlib]system.double
il_0024: ldloc.2
il_0025: box [mscorlib]system.double
il_002a: call void [mscorlib]system.console::writeline(string,
object,
object)
il_002f: ret
} // end of method boxandunbox::main //
第il_0011 至 il_0018 行是描述double dubunbox = (double)objbox**的。
描述一下objbox在拆箱時的情況:(1)環境須先判斷堆疊上指向合法物件的位址,以及在對此物件向指定的型別進行轉換時是否合法,如果不合法,就丟擲異常;(2)當判斷型別轉換正確,就返回乙個指向物件內的值的指標。
改進:
為了避免由於無謂的隱式裝箱所造成的效能損失,在執行這些多型別過載方法之前,最好先對值進行裝箱。
**改進:
using system;
namespace newbu
///
static void main(string args)
' and the unboxed is ",objbox,objunbox);
} ///
} }
C 裝箱與拆箱
裝箱是將 值型別轉換為 引用型別 拆箱是將 引用型別 轉換為值型別 利用裝箱和拆箱功能,可通過允許 值型別的任何值與 object 型別 的值相互轉換,將值型別與引用型別鏈結起來 例如 int val 100 object obj val console.writeline 物件的值 obj 這是乙...
C 裝箱與拆箱
在前面提到了值型別和引用型別。這裡就來和大家一起了解一下,他們互相轉換的過程裝箱 boxing 拆箱 unboxing 由於c 中所有的資料型別都是由基類system.object繼承而來的,所以值型別和引用型別的值可以通過顯式 或隱式 操作相互轉換,而這轉換過程也就是裝箱 boxing 和拆箱 u...
C 裝箱與拆箱
在生活中,我們都喜歡吃水果。大家都知道水果不但為我們提供豐富的膳食纖維,還有維生素及其它營養。例如 吃士多啤梨培養耐心補充維生素,吃香蕉保持快樂心情,吃葡萄增強免疫抗衰老,吃梨幫助器官排毒等等,所有我們經常去買水果,而一般水果都是裝在箱子裡,廠商把水果裝箱賣給經銷商,經銷商在拆箱賣給我們。這就是生活...