深入理解C#的裝箱和拆箱
裝箱和拆箱是值型別和引用型別之間相互轉換是要執行的操作。
1. 裝箱在值型別向引用型別轉換時發生
2. 拆箱在引用型別向值型別轉換時發生
光上述兩句話不難理解,但是往深處瞭解,就需要一些篇幅來解釋了。
我們先看裝箱時都會發生什麼事情,下面是一行最簡單的裝箱程式碼
object obj
= 1; |
這行語句將整型常量1賦給object型別的變數obj; 眾所周知常量1是值型別,值型別是要放在棧上的,而object是引用型別,它需要放在堆上;要把值型別放在堆上就需要執行一次裝箱操作。
這行語句的IL程式碼如下,請注意註釋部分說明:
.locals
init ( [0]
object objValue )
//以上三行IL表示宣告object型別的名稱為objValue的區域性變數
IL_0000:
nop IL_0001:
ldc.i4.s 9 //表示將整型數9放到棧頂 IL_0003:
box [mscorlib]System.Int32 //執行IL
box指令,在記憶體堆中申請System.Int32型別需要的堆空間 IL_0008:
stloc.0 //彈出堆疊上的變數,將它儲存到索引為0的區域性變數中 |
以上就是裝箱所要執行的操作了,執行裝箱操作時不可避免的要在堆上申請記憶體空間,並將堆疊上的值型別資料複製到申請的堆記憶體空間上,這肯定是要消耗記憶體和cpu資源的。我們再看下拆箱操作是怎麼回事:
請看下面的C#程式碼:
object objValue
= 4; int value
= ( int )objValue; |
上面的兩行程式碼會執行一次裝箱操作將整形數字常量4裝箱成引用型別object變數objValue;然後又執行一次拆箱操作,將儲存到堆上的引用變數objValue儲存到區域性整形值型別變數value中。
同樣我們需要看下IL程式碼:
.locals
init ( [0]
object objValue, [1]
int32 'value' )
//上面IL宣告兩個區域性變數object型別的objValue和int32型別的value變數 IL_0000:
nop IL_0001:
ldc.i4.4 //將整型數字4壓入棧 IL_0002:
box [mscorlib]System.Int32 //執行IL
box指令,在記憶體堆中申請System.Int32型別需要的堆空間 IL_0007:
stloc.0 //彈出堆疊上的變數,將它儲存到索引為0的區域性變數中 IL_0008:
ldloc.0 //將索引為0的區域性變數(即objValue變數)壓入棧 IL_0009:
unbox.any [mscorlib]System.Int32 //執行IL
拆箱指令unbox.any 將引用型別object轉換成System.Int32型別 IL_000e:
stloc.1 //將棧上的資料儲存到索引為1的區域性變數即value |
拆箱操作的執行過程和裝箱操作過程正好相反,是將儲存在堆上的引用型別值轉換為值型別並給值型別變數。
裝箱操作和拆箱操作是要額外耗費cpu和記憶體資源的,所以在c# 2.0之後引入了泛型來減少裝箱操作和拆箱操作消耗。
下一篇我們看下使用泛型和不使用泛型情況下的裝箱拆箱情況。
相關文章
- c#的裝箱和拆箱C#
- 深入理解Java之裝箱與拆箱Java
- 深入剖析Java中的裝箱和拆箱Java
- C#之拆箱,裝箱C#
- Visual C#裝箱與拆箱C#
- Effective C#:儘量減少裝箱和拆箱C#
- 深入淺出瞭解“裝箱與拆箱”
- Java的自動裝箱和拆箱Java
- 如何理解Java中的自動拆箱和自動裝箱?Java
- java裝箱拆箱Java
- 談談JavaScript中裝箱和拆箱JavaScript
- Java自動拆箱與裝箱Java
- c#之裝箱和取消裝箱C#
- Java中的自動裝箱與拆箱Java
- 資料型別及拆箱裝箱資料型別
- 【java】JDK5的新特性→→自動裝箱和拆箱JavaJDK
- Java 效能筆記:自動裝箱/拆箱Java筆記
- 基礎鞏固、探尋Java裝箱和拆箱的奧妙!Java
- Java中的自動裝箱與自動拆箱Java
- Java語法糖2:自動裝箱和自動拆箱Java
- Java自動裝箱/拆箱 - Java那些事兒Java
- [JAVA] Java物件導向之包裝類,拆箱、裝箱Java物件
- java空指標出現的情況:拆箱裝箱Java指標
- dotnet學習筆記一 - 裝箱拆箱 (轉)筆記
- 通過原始碼瞭解Java的自動裝箱拆箱原始碼Java
- Java學習之自動裝箱和自動拆箱原始碼分析Java原始碼
- java中的內部類和自動拆裝箱Java
- java基礎(八) 深入解析常量池與裝拆箱機制Java
- .NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱型別
- .NET Core CSharp 中級篇 2-1 裝箱與拆箱CSharp
- 【轉】.NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱型別
- Java 效能要點:自動裝箱/ 拆箱 (Autoboxing / Unboxing)Java
- Integer 自動拆箱封箱
- 一文讀懂什麼是Java中的自動拆裝箱Java
- 【JS迷你書】基本型別之拆箱操作JS型別
- 原來 JS 還存在這樣的拆箱轉換JS
- 電子郵箱是qq郵箱嗎 電子郵箱和qq郵箱的區別聯絡介紹
- 夯實Java基礎系列2:Java自動拆裝箱裡隱藏的秘密Java