再談C#裝箱和拆箱操做

 

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

相關文章
相關標籤/搜索