在Visual Basic中,集合用于在变量中存储一组对象或值。标准集合,如Collection、ArrayList和泛型的List(Of T),提供了不同的访问、添加和删除元素的方法,并在类型安全性、性能和功能上有所不同。
在经典的VB6中,只有类型化集合Collection。在.NET中出现了更强大的结构,其中包括ArrayList(旧的通用类型,没有严格的类型化)和现代的泛型集合(Generic Collections),如在.NET 2.0中出现的List(Of T)。
主要难点是为项目的任务选择合适的集合。没有严格类型化的集合(ArrayList、Collection)可能导致运行时错误或性能问题。泛型集合需要参数化,但提供了最大限度的安全性和类型操作的便利性。
仅将旧集合Collection用于与过时代码的交互,而对新项目则优先使用List(Of T)。仅在没有元素类型信息时,ArrayList才会使用,但对此更好地使用List(Of Object)或其他泛型集合。
代码示例:
' Collection Dim coll As New Collection() coll.Add("Hello") coll.Add(123) ' ArrayList Dim arr As New ArrayList() arr.Add("World") arr.Add(456) ' List(Of T) Dim list As New List(Of Integer)() list.Add(789) list.Add(101112)
关键特性:
Collection与数组在Visual Basic中的区别是什么?
数组在初始化时固定大小,存储单一类型的元素,支持通过索引快速访问。Collection动态增长,可以存储不同类型的对象,并支持通过键访问(但在VB6中不支持索引)。
如果尝试在Collection中添加具有相同键的对象会发生什么?
尝试添加具有已存在键的元素会导致运行时错误:“Key already exists in collection”。
Dim c As New Collection() c.Add("one", "a") c.Add("two", "a") ' 错误
是否可以通过标准方式将ArrayList转换为List(Of T)?
不可以,普通转换是不可能的——必须手动创建新的List(Of T)并复制合适的元素,否则会因ArrayList的非严格类型而产生运行时错误。
在一个用于存储客户的项目中,使用了ArrayList,意外地添加了一个字符串而不是Client对象。在处理阶段出现类型转换错误,这很难追踪。
优点:
缺点:
使用严格类型化的List(Of Client),所有代码使用Strict On选项编译。错误在编译阶段被发现,结构可以轻松地通过新的LINQ方法扩展。
优点:
缺点: