编程VB.NET桌面开发者

在Visual Basic中,标准集合(例如Collection、ArrayList和List(Of T))是如何实现和使用的,它们之间有何根本区别,以及在为特定任务选择集合类型时应注意什么?

用 Hintsage AI 助手通过面试

回答

在Visual Basic中,集合用于在变量中存储一组对象或值。标准集合,如CollectionArrayList和泛型的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集合与VB6的旧代码兼容,不需要类型声明
  • ArrayList是一个动态扩展的列表,没有严格类型,可以存储任何类型的对象
  • List(Of T)是一个泛型集合,需要指定类型,提供安全性和性能

有陷阱的问题。

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的非严格类型而产生运行时错误。

常见错误和反模式

  • 在新项目中使用Collection/ArrayList,而不是泛型集合
  • 在非泛型集合中添加不同类型而失去类型安全
  • 破坏集合的封装(将其返回外部以进行更改)

生活示例

负面案例

在一个用于存储客户的项目中,使用了ArrayList,意外地添加了一个字符串而不是Client对象。在处理阶段出现类型转换错误,这很难追踪。

优点:

  • 最初实现快速

缺点:

  • 缺乏类型安全性
  • 难以维护/扩展

正面案例

使用严格类型化的List(Of Client),所有代码使用Strict On选项编译。错误在编译阶段被发现,结构可以轻松地通过新的LINQ方法扩展。

优点:

  • 类型安全性
  • 可扩展性
  • 高性能

缺点:

  • 声明时需要指定类型,这稍微增加了代码