C#泛型集合与非泛型集合

在.NET FCL为我们提供了很多集合类型,是编程中非常有力的工具。泛型集合主要在System.Collections.Generic名称空间中,而非泛型集合主要在System.Collections,首先抛出结论:如果在C#2.0版本以上,尽量使用泛型集合类,而不使用非泛型集合类。因为,1.泛型编程是从c#2.0开始才被.net支持的。2.泛型集合在性能和类型安全方面优于非泛型集合。

 

非泛型集合-System.Collections名字空间中的类主要包括ArrayList, Hashtable,Queue,SortedList,Stack等,而泛型集合-System.Collections.Generic中常用的包括List<T>,LinkedList<T>,Queue<T>,Stack<T>。这些都是非常常见的数据结构。

 

性能问题

下面以ArrayList与List<T>为例说明泛型集合的优点及非泛型集合的缺点。(可以通过Visual Studio的object browser浏览这两个类的方法,属性等)。例如,有这么一段代码:

 

1.        ArrayList numbers = new ArrayList();

2.        numbers.Add(22);

3.        numbers.Add(35);

 

4.        int number =(int) numbers[1];

5.        Console.WriteLine(number);

这段代码的背后会发生什么呢?首先,ArrayList中将所有元素都看成Object类型的,是引用类型。第一行声明一个ArrayList的对象,第二,三行调用Add方法增加两个整数。在这个过程中,整数22,35被CLR装箱(boxing)成object类型的,而在第四行访问第二个元素时又被拆箱(unboxing),装箱与拆箱大体上会发生以下过程

1.      在托管堆中非配一个新的object

2.      基于栈(stack-based)的数据必须移动到刚非配的内存区中

3.      当拆箱时,位于堆中的数据又得移动到栈中

4.      堆中无用的数据进行垃圾回收

当涉及大量装箱与拆箱操作时,必然会影响应用程序的性能。而是用泛型的集合类时,比如用

 

List<int> numbers = new List<int>();代替上述第一行,第四行相应改成

int number = numbers[1];减少了装箱与拆箱的工作,当存在大量数据时,自然可以提高很多性能。

 

类型安全问题

对于ArrayList,下面的代码编译时时不会报错的。

ArrayList numbers = new ArrayList();

numbers.Add(22);

numbers.Add(35.5);

numbers.Add(true);

 

 

  for (int i = 0; i < numbers.Count; i++)

      {

       Console.WriteLine((int)numbers[i]);

      }

因为可以将int类型,float等数值类型装箱成object,因此即使ArrayList增加的数据类型不一致。编译器也不会提示错误,但是运行时,会报错。

但是如果是用泛型类型比如List<T>,那么在编译时就会进行类型检查。防止运行时错误。

 

总结:FCL集合类型为我们提供了有力的工具,使用时,考虑性能和类型安全的原因,尽量使用泛型版本的集合类型(c#2.0以前不支持泛型因此使用非泛型集合类型)。

转载于:https://www.cnblogs.com/Binyb/archive/2012/09/06/2673925.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值