VBScript 字典存在方法始终返回 true



我做错了什么?根据我的测试,objDic.exist永远不会给出错误!

    dim objDic
    set objDic = createobject("scripting.dictionary")
    objDic.add "test","I have not been deleted"
    wscript.echo objDic.item("test") 'Displays -- I have not been deleted
    objDic.remove "test"
    wscript.echo """" & objDic.item("test") & """" 'Displays -- ""
    if objDic.exists("test") then wscript.echo """" & objDic.item("test") & """" 'Displays -- ""

我所知,字典对象键是通过仅引用它来创建的,就好像它确实存在一样。

wscript.echo objDic.Item("test") 'Creates the key whether it exists or not
wscript.echo objDic.Exists("test") 'Will now return true

这里有一些代码,你可以尝试证明/测试我的理论。我通常使用 MsgBox 而不是 WScript.Echo,正如您将在我的代码中看到的那样。

dim objDic, brk
brk = vbcrlf & vbcrlf
set objDic = createobject("scripting.dictionary")
objDic.add "test","I have not been deleted"
wscript.echo "objDic.Exists(""test""): " & brk & objDic.item("test")
WScript.Echo "Now going to Remove the key named: test"
objDic.remove "test"
MsgBox "objDic.Exists(""test""): " & brk & objDic.Exists("test") 'Returns False
wscript.echo "objDic.item(""test""): " & brk & objDic.item("test") 'Shows Blank, Creates the key again with a blank value
wscript.echo "objDic.item(""NeverAdded""): " & brk & objDic.item("NeverAdded") 'Also shows blank, does not return an error
MsgBox "objDic.Exists(""test""): " & brk & objDic.Exists("test") 'Returns True

从 IDE 中删除与字典相关的所有受监视变量。它是可重复的。您可以通过这种方式导致/修复行为(Outlook 2010 VBA IDE)。有点像我猜的观察者效应。

-米

这里有同样的问题...
在我的代码中,有一个动态的字典数组。
有些条目具有键"HIGH",有些则没有。
测试每个条目的键是否存在始终返回 true:

for each dictionary_entry in dictionary_array
      if dictionary_entry.Exists("HIGH") then msgbox("Hey, I have a HIGH key, and its value is " + dictionary_entry("HIGH))
next

如果我观察变量,调试器会为每个dictionary_entry创建一个"HIGH"键。
必须从监视变量中删除dictionary_entrydictionary_array才能使代码正常工作。

这个问题给我带来了很多麻烦。

事实证明,我在代码前面的键上运行了一个"If"函数,因此它将其添加到字典中。

If dict(key) = "chocolate" then 
Check = dict.exists(key) 'Always resolves to true
End If
Whatis = dict(key) 'resolves to ""

因此,if 函数中的值不会添加到字典中,而是添加键。

遇到同样的问题,删除了 IDE 中所有监视的变量并修复了它

接受的答案没有回答我的问题。我想其他人也一样,所以我正在发布我的解决方案,因为这个线程是谷歌的第一个结果。

如果密钥不存在,则默认情况下将创建该密钥。字典旨在添加不存在的条目,因此以下内容将始终返回 true。

If objDic.exists("test") then

由于密钥是在测试其是否存在时创建的,因此尚未定义该值。下面将测试键是否没有与之关联的值。当然,如果您有空白值,这将不适用于您的字典。

If objDic.item("test") <> "" then

最新更新