使用早期绑定(bind)和 Microsoft 脚本运行时库创建字典对象时,同一事物似乎有 2 个等效的类型名称:
Dim dict as Dictionary
Set dict = New Dictionary
和
Dim dict as Scripting.Dictionary
Set dict = new Scripting.Dictionary
似乎做了同样的事情(至少到目前为止)。
我看到使用了 As Scripting.Dictionary
语法 by this resource ,我看到使用了 As Dictionary
语法 by this (really great) resource ,但我还没有在任何地方看到比较。关于词典的 MSDN 文档是 a literal joke ,或not explicitly related to VBA .
如果我可以只使用As Dictionary
,我不明白为什么我应该做额外的输入,只是为了让我的函数声明更加拥挤,但我了解到VBA中的一些东西看起来像它们是等效的,实际上可能存在细微但显着的差异(例如 Application.InputBox
与 InputBox
)。
这些之间真的没有区别吗,还是有我应该注意的细微差别?
最佳答案
I don't see why I should be doing extra typing just to make my function declarations more crowded [...]
这就是我们所说的完全限定类型(或函数/过程调用,取决于上下文)。当你这样做时:
Dim foo As Range
类型范围
以非常特定的顺序进行解析,该顺序由引用对话框中的优先级顺序确定:
如果公开 Range
类型的最顶层类型库是 Excel
类型库,则 Range
代表 Excel .范围
.
如果您的意思是 Word.Range
,那么您就有一个错误,并且完全限定声明的类型可以防止这种情况发生。
Scripting
库公开了一个 Dictionary
类。因此,当您引用 Scripting
类型库并执行以下操作时:
Dim foo As Dictionary
您有权期望该类型解析为 Scripting.Dictionary
。但是,如果您添加一个类模块并将其命名为 Dictionary
,突然之间,所有这些不合格的声明都引用了这个自定义类,因为 VBA 类型解析将始终优先考虑当前项目中定义的类型,然后再查看外部引用文献。
两种方法各有利弊:
- 完全限定类型可以避免引用公开同名类的类型库时出现歧义:它增强了可读性。
- Not 限定类型可以更轻松地将一个类交换为另一个类,例如将 Scripting.Dictionary 替换为 portable
Dictionary
implementation可在 Mac 上运行。
根据经验,编程不是编写代码,而是......主要是阅读代码!编写易于阅读的代码,而不是快速编写的代码 - future 的自己稍后会感谢您!
关于vba - "As Dictionary"和 "As Scripting.Dictionary"是否等效(对于 VBA 早期绑定(bind))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48429138/