學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...