编程Visual Basic 开发者

在 Visual Basic 中使用 Dictionary 类型的集合有什么特点,如何正确创建和使用它们,以及在访问不存在的键时有哪些细节?

用 Hintsage AI 助手通过面试

答案。

在 Visual Basic 中,Dictionary 是一种关联集合,可以存储键-值对。在 VB.NET 中,使用 Dictionary(Of TKey, TValue),来自命名空间 System.Collections.Generic

问题背景

早期版本的 Visual Basic 限制于经典集合 (Collection),仅支持字符串或数字键且不类型化。随着 VB.NET 和 .NET Framework 的出现,集合中引入了泛型 Dictionary,使得处理关联数据更加安全和快速。

问题

使用 Dictionary 时的典型错误包括:

  • 在访问时未检查键是否存在
  • 错误声明或尝试访问未初始化的集合
  • 选择键类型错误(例如,使用复杂对象而没有重载 Equals/GetHashCode)。

解决方案

在使用 Dictionary 时至关重要:

  • 始终通过 ContainsKey 方法检查键的存在
  • 正确初始化集合
  • 使用适当的类型作为键和值

代码示例:

Dim dict As New Dictionary(Of String, Integer) dict("apples") = 10 ' 在访问之前进行安全检查: If dict.ContainsKey("bananas") Then Console.WriteLine(dict("bananas")) Else Console.WriteLine("未找到键!") End If

关键特点:

  • 通过使用泛型实现类型安全
  • 基于键的高访问速度 (O(1))
  • 键和值类型的灵活性

有陷阱的问题。

访问 Dictionary 中不存在的键时抛出什么异常,如何避免?

错误:System.Collections.Generic.KeyNotFoundException。需要使用 ContainsKey 方法来防止此错误。

可以修改已存在的 Dictionary 元素的键吗?

不可以。键在添加后无法修改——只能删除元素并使用另一个键添加新元素。

Dictionary 和 Hashtable 在 VB.NET 中有什么区别?

Dictionary 是类型安全的(泛型),运行速度更快,不需要对值进行装箱/拆箱。Hashtable 是旧的,且不推荐使用。

常见错误和反模式

  • 在通过索引器访问时不检查键的存在性
  • 在没有重载 Equals 和 GetHashCode 方法的情况下使用复杂对象作为键
  • 错误地认为 Dictionary 中元素的顺序是固定的

生活中的例子

** 消极案例

程序员通过 Dictionary 保存按城市的销售统计,但在访问前没有检查城市键是否存在。对此新城市的报告时,会得到 KeyNotFoundException。

优点:

  • 直接访问简化了代码

缺点:

  • 程序崩溃,用户无法获得准确的报告

** 积极案例

同样的报告,但在访问键时始终使用 ContainsKey 检查,如果键不存在,则返回 0 或输出消息。

优点:

  • 没有故障,所有统计数据始终正确

缺点:

  • 需要更多的代码和开发者的注意力