我的班级有多种方法。一些方法接受参数。这些方法需要关键字“Call”才能工作。为什么?
MyObject.MyMethod 'Works just fine without Call.
Call MyObject.MyMethod(arg1, arg2) 'Requires Call. Won't compile without it.
Run Code Online (Sandbox Code Playgroud)
Call
从来不需要。事实上,自从在 Visual Basic 4.0 中出现隐式调用语法以来,它已经过时了,如果我没记错的话。
object.MemberName arg1, arg2
Run Code Online (Sandbox Code Playgroud)
注意括号不见了。正如您所指出的,这将是非法的:
object.MemberName (arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
注意MemberName
和开头之间的空格(
:VBE 将始终在那里放置一个空格。这就是 VBE 所说的“好的,所以我将采用这些括号中的内容,将其作为表达式进行评估,并将结果按值(无论成员的签名是否明确指定ByRef
)传递给您正在调用的成员”。除了(foo, bar)
不是一个合法的表达式,所以代码不能编译。
当MemberName
返回调用者需要捕获的值时,括号的行为有所不同:
foo = object.MemberName(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
注意没有空格了;如果您添加任何内容,VBE 将删除它。
所以用一个更熟悉和更具体的例子 - 请注意,它与对象和成员无关:
MsgBox "Yes?", vbYesNo ' works fine
Call MsgBox("Yes?", vbYesNo) ' works fine
Call VBA.Interaction.MsgBox("Yes?", vbYesNo) ' works fine
MsgBox ("Yes?", vbYesNo) ' illegal
result = VBA.Interaction.MsgBox("Yes?", vbYesNo) ' works fine
Run Code Online (Sandbox Code Playgroud)
该Call
关键字只存在于VBA6 / VBA7向后兼容的目的,许多人一样,许多其他语言结构(While...Wend
想到)。这就是为什么Rubberduck(免责声明:我是该开源项目的管理员之一)将其使用标记为“过时”,并提供工具来删除它。
归档时间: |
|
查看次数: |
57 次 |
最近记录: |