再谈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

相关文章
相关标签/搜索