编程后端开发工程师 (Visual Basic)

如何在 Visual Basic 中实现字典 (Dictionary(Of TKey, TValue)),可用的操作有哪些,以及在通过不存在的键获取值时可能遇到的陷阱是什么?

用 Hintsage AI 助手通过面试

答案。

问题背景

随着 .NET Framework 的出现,Visual Basic 获得了一种类型安全和高效的键值对存储结构 — Dictionary(Of TKey, TValue)。这是一个标准的关联容器,用于快速查找。

问题

操作字典时常常会导致错误:尝试通过不存在的键访问值时会引发异常。此外,通常也会混淆添加、修改和插入新值的操作。

解决方案

访问值时使用索引器或方法 TryGetValue、ContainsKey。为了避免 KeyNotFoundException 异常,始终进行显式检查:

代码示例:

Dim dict As New Dictionary(Of String, Integer)() dict.Add("one", 1) dict("two") = 2 ' 添加新键值对 If dict.ContainsKey("three") Then Console.WriteLine(dict("three")) ' 不会引发错误 Else Console.WriteLine("找不到键") End If Dim value As Integer = 0 If dict.TryGetValue("one", value) Then Console.WriteLine(value) End If

关键特点:

  • 通过键的快速访问(哈希)
  • 显式检查键的存在可以避免错误
  • 通过 Remove 和索引器实现键的删除和替换

误导性问题。

真的存在 dict("键") 会总是添加新的键值对吗?

不。若键存在,则更新值。若不存在 — 则添加该对。要在键存在时添加并引发错误 — 请使用 Add。

如果键不存在,TryGetValue 会引发异常吗?

不会。它将返回 False,不会引发异常,也不会改变 value。这是一种安全的访问方式。

可以将值类型(例如,Integer)作为 TValue 存储在字典中,同时对缺失键返回 null 吗?

不可以。对于值类型,将返回该类型的默认值(Integer 为 0),但通过索引器访问时在缺失键的情况下仍会引发异常。

常见错误和反模式

  • 在没有检查的情况下通过索引器访问不存在的键
  • 通过 Add 导致键重复(会引发 ArgumentException)
  • 忽视 TryGetValue 的返回值

生活中的例子

负面案例

在不同地方重复通过索引访问字典而未进行预先检查 — 程序偶尔崩溃。

优点:

  • 代码更简洁

缺点:

  • 应用程序不稳定,难以捕捉错误

正面案例

广泛使用 TryGetValue,所有访问都是安全的,缺失键的情况得到合理处理。

优点:

  • 一致的行为,没有异常

缺点:

  • 需要为值定义 out 变量