裝箱:將值型別轉換為引用型別時發生。值型別是放在棧上的,而引用型別是放在堆上的,將值型別轉換為引用型別,堆需要申請記憶體儲存從棧複製過來的資料,這就是一次裝箱的過程。
拆箱:將引用型別轉換為值型別時發生。與裝箱的過程相反,拆箱是將儲存在堆上的引用型別值轉換為值型別並給值型別。
值型別:常見的值型別有int、float、long、char、bool、enum、struct
引用型別:常見的引用型別有陣列、類、介面、委託、object、字串
問題:裝箱和拆箱操作是額外耗費cpu和記憶體資源的
優化裝箱和拆箱
1.避免隱式型別轉換
string s=
"引用型別"
;int num=2;
s=s+num;
執行最後一行的**時,s是引用型別,num是值型別,int型別的變數可以隱式轉換為字串型別的變數,這裡就發生了一次裝箱的操作
string s=
"引用型別"
;int num=2;
s=s+num.
tostring()
;
將值型別顯式轉換為引用型別,就不會再發生裝箱操作了
2.使用泛型
var arr=
newarraylist()
;arr.
add(1)
;arr.
add(2)
;foreach
(int
value
in arr)
這執行上面的**的過程中,新增兩隻型別的元素發生兩次裝箱操作,使用foreach遍歷時將object型別轉成int型別,發生兩次拆箱操作,最後執行輸出函式的時候,執行兩次裝箱操作。如果集合中元素更多時,裝箱拆箱的操作會更多。
var arr=
newlist
<
int>()
;arr.
add(1)
;arr.
add(2)
;foreach
(int
value
in arr)
與上面**唯一不同的時就是使用了泛型集合,指定元素的型別,在新增或比遍歷取值的時候減少了裝箱和拆箱的操作,避免了對效能的浪費
小結:
裝箱和拆箱的存在,讓值型別與引用型別的轉換變得很方便,但是頻繁的裝箱和拆箱操作會大大降低cpu的效能,因此我們在開發的過程中要合理的使用型別轉換和泛型類或方法避免裝箱和拆箱操作
C 裝箱與拆箱
要掌握裝箱與拆箱,就必須了解cts及它的特點。net重要技術和基礎之一的cts common type system 顧名思義,cts就是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。net將整個系統的型別分成兩大類 value type 和 reference type...
C 裝箱與拆箱
裝箱是將 值型別轉換為 引用型別 拆箱是將 引用型別 轉換為值型別 利用裝箱和拆箱功能,可通過允許 值型別的任何值與 object 型別 的值相互轉換,將值型別與引用型別鏈結起來 例如 int val 100 object obj val console.writeline 物件的值 obj 這是乙...
C 裝箱與拆箱
在前面提到了值型別和引用型別。這裡就來和大家一起了解一下,他們互相轉換的過程裝箱 boxing 拆箱 unboxing 由於c 中所有的資料型別都是由基類system.object繼承而來的,所以值型別和引用型別的值可以通過顯式 或隱式 操作相互轉換,而這轉換過程也就是裝箱 boxing 和拆箱 u...