VBA Scripting.Dictionary class 的 .item() 方法的奇怪行为

Strange behaviour of .item() method of Scripting.Dictionary class in VBA

因为我以前用Python语言编程,所以我习惯使用数据的字典结构。现在,我需要在 VBA 中编程,如果可能的话,我想使用相同的结构。

为了学习VBA中的方法,我写了这个程序。第一个 .count 方法抛出“4”,而第二个 .count 方法抛出“5”。当我调试时,我很惊讶 "COSLADA" 在 dic 中有一个空值。因此,当我打算检索一个不存在的关键项时,.item() 方法并没有抛出错误,而是创建了一个具有空值的新项。

Sub Diccionarios()
    Dim dic As Scripting.Dictionary
    Set dic = New Scripting.Dictionary
    With dic
        .Add "ALCORCON", "MADRID"
        .Add "COLLADO VILLALBA", "MADRID"
        .Add "FUENLABRADA", "MADRID"
        .Add "TORRREJON DE ARDOZ", "MADRID"
    End With
    MsgBox dic.Count
    MsgBox dic.Item("COSLADA")
    MsgBox dic.Count
End Sub

当键不存在时,是否有任何其他字典方法来检索不创建具有空值的项目的项目值?

这是众所周知的行为,Microsoft 经常在博客和其他在线诽谤中受到打击。

'workaround'(如果您可以将其称为处理已知行为的已知方法)是使用 Scripting.Dictionary 的 Exists method 来测试密钥的在请求项目之前存在。

Sub Diccionarios()
    Dim dic As Scripting.Dictionary
    Set dic = New Scripting.Dictionary
    With dic
        .Add "ALCORCON", "MADRID"
        .Add "COLLADO VILLALBA", "MADRID"
        .Add "FUENLABRADA", "MADRID"
        .Add "TORRREJON DE ARDOZ", "MADRID"
    End With
    MsgBox dic.Count
    If dic.Exists("COSLADA") Then _
        MsgBox dic.Item("COSLADA")
    If dic.Exists("FUENLABRADA") Then _
        MsgBox dic.Item("FUENLABRADA")
    MsgBox dic.Count
End Sub

简而言之,Microsoft Scripting.Dictionary 的后端与 Python 的词典不同,它们的行为也不同,因为 它们不是一回事 .我从来没有真正弄明白为什么这么多人不能理解这一点。