问题背景
随着 .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
关键特点:
真的存在 dict("键") 会总是添加新的键值对吗?
不。若键存在,则更新值。若不存在 — 则添加该对。要在键存在时添加并引发错误 — 请使用 Add。
如果键不存在,TryGetValue 会引发异常吗?
不会。它将返回 False,不会引发异常,也不会改变 value。这是一种安全的访问方式。
可以将值类型(例如,Integer)作为 TValue 存储在字典中,同时对缺失键返回 null 吗?
不可以。对于值类型,将返回该类型的默认值(Integer 为 0),但通过索引器访问时在缺失键的情况下仍会引发异常。
在不同地方重复通过索引访问字典而未进行预先检查 — 程序偶尔崩溃。
优点:
缺点:
广泛使用 TryGetValue,所有访问都是安全的,缺失键的情况得到合理处理。
优点:
缺点: