匯入 全面認識裝箱與折箱

2021-09-05 14:22:16 字數 1399 閱讀 6283

學c#有近一年了,對裝箱與拆箱有了一定的了解,但昨天晚上看了.framework程式設計後,才發現自己的認識都只是片面的。

首先說明:為什麼要清楚裝箱與折箱,因為裝箱與折箱對程式的效能有很大的影響,因此在寫**的時候要時刻注意這些問題。

裝箱與折箱都只對值型別資料而言,而對於引用型別資料,都是在託管的堆上執行的,也就不存在裝箱與折箱問題了,也就不討論了。

對於所有的基本資料型別,除了string(string)以外,其它的都是值型別。

看這樣的乙個例子:

int m_num=4;

object m_obj=m_num;

console.writeline(「「,(int)m_obj);

一共進行了幾次裝箱與折箱?

答案是兩次裝箱與一次折箱!其中的一次裝箱與一次折箱應該看的很明白,還有一次裝箱是什麼時候呢?

讓我們來看看ildasm.exe工具為我們銀板的il**:

.method public hidebysig static void  main() cil managed

"il_000e:  ldloc.1

il_000f:  unbox      [mscorlib]system.int32

il_0014:  ldind.i4

il_0015:  box        [mscorlib]system.int32

il_001a:  call       void [mscorlib]system.console::writeline(string,

object)

il_001f:  ret

} // end of method sample::main

看到了嗎?清楚的兩次box與一次unbox.而第二次box是在call void system.console::writeline()之前發生的。

因為writeline(string,object),它要求第二個引數為object型別,所以把m_obj折箱後又被裝箱。是為了滿足引數的要求。

也就是說上面的**改為:

console.writeline(「「,m_obj);

那麼就只有一次裝箱了。

那這樣做呢?

console.writeline(「「,m_num);

顯然這是會發生一次裝箱的。因為m_num為值型別,而引數要求object型別。

這就是說,當我們呼叫一些函式的時候應該注意這些問題了。

時間關係,今天早上先只寫這一點,有時間再討論這個問題。

注意:裝箱與折箱是il裡最影響效能的地方,所以要盡可能少的產生裝箱與折箱的il**。

因為很多地方都是隱式的(像上面的第二次裝箱,而且這只是乙個簡單的說明,可以想像,在大量的**裡,會有多少這樣的裝箱與折箱發生著),所以,要想寫出好的il**,讓你的程式新效率更高,請注意這個裝箱與折箱問題吧。

C 裝箱 折箱

裝箱 boxing 和拆箱 unboxing 是c 型別系統的核心概念.是不同於c與c 的新概念!通過裝箱和拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.c 語言中的所有型別都是由...

C 的裝箱和折箱

c 的裝箱和折箱 2007年10月15日 星期一 上午 10 50 在學習裝箱和折箱之前,我覺得有必要介紹一下c 中的 值型別 和 引用型別 以下觀點僅是個人學習心得和體會,不足之處多多指教 先說一下c 中的 值型別 和 引用型別 這個先要從c 的原理中才好理解 值型別 它的資料儲存在記憶體中的堆疊...

裝箱與拆箱

總結來說 裝箱就是將值型別轉化成引用型別,拆箱就是就是將引用型別轉化成值型別 裝箱 int n 10 string s n.tostring 這個不是裝箱。string與int是完全不同的兩種型別,沒有父子類關係,所以不可能發生裝箱和拆箱,因為本身就不具備型別直接轉換的功能。console.writ...