1. 使用非泛型集合時引起的裝箱和拆箱操做 工具
看下面的一段代碼:性能
1
2
3
4
5
6
7
8
|
var
array =
new
ArrayList();
array.Add(1);
array.Add(2);
foreach
(
int
value
in
array)
{
Console.WriteLine(「value
is
{0}」,value);
}
|
代碼聲明瞭一個ArrayList對象,向ArrayList中添加兩個數字1,2;而後使用foreach將ArrayList中的元素打印到控制檯。spa
在這個過程當中會發生兩次裝箱操做和兩次拆箱操做,在向ArrayList中添加int類型元素時會發生裝箱,在使用foreach枚舉ArrayList中的int類型元素時會發生拆箱操做,將object類型轉換成int類型,在執行到Console.WriteLine時,還會執行兩次的裝箱操做;這一段代碼執行了6次的裝箱和拆箱操做;若是ArrayList的元素個數不少,執行裝箱拆箱的操做會更多。code
你能夠經過使用ILSpy之類的工具查看IL代碼的box,unbox指令查看裝箱和拆箱的過程對象
2. 使用泛型集合的狀況blog
請看以下代碼:ci
var
list =
new
List<
int
>();
list.Add(1);
list.Add(2);
foreach
(
int
value
in
list)
{
Console.WriteLine(
"value is {0}"
, value);
}
|
代碼和1中的代碼的差異在於集合的類型使用了泛型的List,而非ArrayList;咱們一樣能夠經過查看IL代碼查看裝箱拆箱的狀況,上述代碼只會在Console.WriteLine()方法時執行2次裝箱操做,不須要拆箱操做。string
能夠看出泛型能夠避免裝箱拆箱帶來的沒必要要的性能消耗;固然泛型的好處不止於此,泛型還能夠增長程序的可讀性,使程序更容易被複用等等。it