"As Dictionary"和"As Scripting.Dictionary"是否相同(对于VBA早期绑定)?

nat*_*ork 3 excel vba dictionary excel-vba

使用早期绑定和Microsoft Scripting Runtime Library创建字典对象时,看起来有两个相同的类型名称用于同一事物:

Dim dict as Dictionary
Set dict = New Dictionary
Run Code Online (Sandbox Code Playgroud)

Dim dict as Scripting.Dictionary
Set dict = new Scripting.Dictionary
Run Code Online (Sandbox Code Playgroud)

似乎做同样的事情(至少到目前为止).

我看到了这个资源As Scripting.Dictionary使用的语法,我看到了这个(非常好的)资源使用的语法,但我没有看到任何地方的比较.关于字典的MSDN文档要么是文字笑话,要么与VBA没有明确相关.As Dictionary

我不明白为什么我应该做额外的打字只是为了让我的函数声明更加拥挤,如果我可以使用As Dictionary,但我已经了解到VBA中看起来像它们相同的一些东西实际上可以有微妙但显着的差异(Application.InputBoxvs .InputBox例如).

这些之间是否真的没有区别,或者我应该注意哪些微妙的差异?

Mat*_*don 9

我不明白为什么我应该做额外的打字只是为了让我的功能声明更加拥挤[...]

它被称为完全限定类型.

当你这样做:

Dim foo As Range
Run Code Online (Sandbox Code Playgroud)

引用对话框中,Range优先级顺序确定的类型以非常特定的顺序解析:

工具/参考对话框

如果公开Range类型的最顶层类型库是Excel类型库,那么Range代表Excel.Range.

如果您的意思是Word.Range,那么您就有一个错误,并且完全限定您声明的类型可以避免这些错误.

Scripting库公开了一个Dictionary类.因此,当您引用Scripting类型库并执行此操作时:

Dim foo As Dictionary
Run Code Online (Sandbox Code Playgroud)

您有权期望要解析的类型Scripting.Dictionary.但是如果你添加一个类模块并命名它Dictionary,突然所有这些非限定声明现在都引用了这个自定义类,因为在查看外部引用之前,VBA类型解析将始终优先考虑当前项目中定义的类型.

当然你可以称之为"额外打字".只要知道这两种方法都有利有弊.

  • 完全限定类型在引用暴露同名类的类型库时避免了歧义:它增强了可读性.
  • 符合条件的类型可以更容易地将一个类交换为另一个类,例如替换Scripting.Dictionary为适用于Mac 的便携式Dictionary实现.

经验法则,编程不是关于编写代码.这是关于阅读代码.编写易于阅读的代码,而不是快速编写的代码.

  • 请注意,在某些情况下,资格认证可能会导致不同的行为.例如``VBA.Array()`总是Base 0,而`Array()`取'Option Base`定义的base,默认为零. (4认同)
  • `InputBox` 是一个完全不同的东西——一个是在标准库的 `VBA.Interaction` 模块中定义的函数(它总是最高优先级),另一个是在 `Excel.Application` 类中定义的函数,在 Excel 类型库中定义(始终是第二优先级)-到目前为止,我们讨论的是*限定类型*,但`Application.InputBox` 是*成员调用*-`Application` 是`Excel.Global 的属性` 隐藏模块,返回一个 `Excel.Application` 实例。[我的 Rubberduck 插件可以告诉你这个](https://i.stack.imgur.com/l80Q7.png) (3认同)
  • @FlorentB。没错,但是IMO也是一个血腥邪恶的“特征”-我看不出讨厌合法的理由来讨厌VBA(99%的时间是关于VBIDE的),但是“ **”绝对是其中的一个=) (2认同)
  • @nateAtwork 速度测试不可能是决定性的——绑定发生在编译时,而不是运行时;这将是 *late* 绑定,并且延迟绑定应该会稍微慢一些,尽管我怀疑它是否可以观察到(提示:任何声明为 `As Object` 或 `As Variant` 的内容都将在运行时绑定,这就是为什么您不会对返回“Object”或“Variant”的任何内容获得智能感知)。至于常见的库,我不知道。ADO 和 DAO 具有非常相似的类型,而 Word 的“范围”与 Excel 的著名冲突。 (2认同)