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