1. 程式人生 > >裝箱與拆箱以及效能損失

裝箱與拆箱以及效能損失

先分析一下值型別與引用型別

值型別:      Int32 i =4; 【變數i是值型別,被分配在棧上,變數包含變數例項,使用效率高】

引用型別:   object o = i; 【變數o是引用型別,被分配在託管堆,變數包含例項的指標,通過此指標引用其例項】

引用型別效能要比值型別差很多,因此儘量使用值型別,而少使用引用型別。

裝箱

1 2 3 Int32 i =4;  定義一個值型別 objct o = i; [裝箱]這個值型別被複制並分配到託管堆,並把它轉成引用型別O,這一個過程將會造成效能損失。

拆箱

1 2 3 4 5 Int32 i =4;  定義一個值型別 objct o = i; 轉成引用型別O Int32 n = (Int32)O;[拆箱]將託管堆中的引用型別例項複製到棧中,轉為值型別n

由此可見,裝箱和拆箱是要儘量避免的操作。

同時,儘可能少用Array,它的ADD操作會將值型別變數轉為引用型別,而泛型List則不會,它是一個增強版的Array,它可以直接新增值型別到List中。

1 2 3 4 5 Int32 i = 4;  定義值型別 Array a = new Array(); 定義一個集合 a.Add(i); 將值型別加入集合中,但是這一個過程會發生裝箱。