Visual Basic 2005 – ArrayList类别还是最佳选择吗?
我想是过去各方大力宣传并鼓吹使用的结果,直到如今,我们发现许多朋友还是非常喜欢使用ArrayList类别。事实上在许多时候,ArrayList类别已经不是最佳的选择。
就功能性而言,.NET Framework 2.0所推出的泛用集合类别List就是对应于非泛用集合类别ArrayList。在此要提醒大家,在大多数的情况下,List拥有较佳的效率而且是类型安全的。如果您将一个参考类型(Reference Type)传递给List的类型参数T,则List与ArrayList的运作是完全相同的。然而,如果您将一个数值类型(Value Type)传递给类型参数T,您就必须仔细评估实作与boxing议题。
您将一个数值类型传递给类型参数T,编译器会特别针对该数值类型产生List类别的一个实作。此意味着,List对象中的项目在可以被使用之前并不需要加以Box,在大约500个项目被建立之后,储存未box项目的内存会大于用来产生此类别实作的内存。
使用泛用集合类别List的类型特定实作要优于使用ArrayList类别或是自行去撰写一个强类型包装集合。理由是您的实作必须去再做一次 .NET Framework 已经替您做好的事情,而且 CLR 能够共享Microsoft中继语言程序代码和中继数据,而这是您的实作所做不到的。
我们之所以会建议使用泛用集合类别,主要原因就是您不需要衍生自一个基底集合类型并实作类型特定的成员就可以立即享有类型安全的好处。此外,当集合项目是数值类型(Value Type)的时候,也将因为不需要去box集合项目,而使得泛用集合类别在效率表现上会优于相对应的非泛用集合类别,而且也会优于衍生自非泛用基底集合类别的类别。
因此呢,如果您的应用程序过去曾经使用了某些非泛用集合类别,现在应该尽可能使用 .NET Framework 2.0所新提供之相对应功能的泛用集合类别来加以改写。请您参阅图表 1,以便清楚了解 .NET Framework 2.0新提供之泛用集合类别与原先之非泛用集合类别的功能对应关系。
泛用集合类别与非泛用集合类别的功能对应关系 |
|
泛用集合类别 |
非泛用集合类别 |
List |
ArrayList |
Dictionary |
Hashtable |
Queue |
Queue |
Stack |
Stack |
SortedList |
SortedList |
Collection |
CollectionBase |
ReadOnlyCollection |
ReadOnlyCollectionBase |
图表1
除了图表1所列的各个泛用集合类别之外,.NET Framework 2.0还新增了下列数个泛用集合类别,还这些泛用集合类别并没有功能相对应的非泛用集合类别:
q 泛用集合类别LinkedList是一个通用的连结清单,它提供 O(1) 插入与移除操作。
q 泛用集合类别SortedDictionary是一个具备 O(log n) 插入与移除操作的排序字典,它很适合用来替换SortedList。
q 泛用集合类别KeyedCollection可以说是清单与字典的混合体,它提供了一个方式来储存拥有内嵌索引键的值。
在此还要提醒大家,泛用集合类别所拥有的某些功能性是非泛用集合类别所付之阙如的。举例来说,以对应于非泛用集合类别ArrayList的泛用集合类别List而言,它就提供了好几个能够接收泛用委派的方法,例如Predicate委派允许您指定用来搜寻清单的方法;Action委派代表要在清单中每一个项目上执行一个动作的方法;Converter委派则能够让您定义类型之间的转换。
另外呢,泛用集合类别List允许您指定您自己的泛用接口IComparer来排序与搜寻清单;泛用集合类别SortedDictionary与SortedList亦具备此能力,而且还允许在集合被建立时指定比较子;类似地,泛用集合类别Dictionary与KeyedCollection允许您指定您自己的相等比较子。
当您下次要使用到集合对象的时候,别忘了要把这些泛用集合类别纳入考虑喔!
参考数据:
《Visual Basic 2005程序开发与界面设计秘诀》