我应该在VB/VBA中使用Call关键字吗?

Fre*_*ant 46 vb.net vb6 vba call

Call在VB/VBA中调用subs时使用关键字.我知道这是可选的,但是使用它还是不让它更好?我一直以为它更明确,但也许只是噪音.

另外,我在另一个论坛上看到了这个:使用Call关键字更快,因为它知道它不会返回任何值,因此它不需要设置任何堆栈空间来为返回值腾出空间.

Jam*_*och 28

啊哈.我一直想知道这个,甚至在VBA上阅读一本2英寸厚的书基本上都说不要使用它,除非你想使用VBE 的Find功能轻松地在大型项目中查找调用.

但我刚发现另一种用途.

我们知道可以用冒号字符连接代码行,例如:

Function Test(mode as Boolean) 
    if mode = True then x = x + 1 : Exit Sub
    y = y - 1
End Sub
Run Code Online (Sandbox Code Playgroud)

但是如果你在行的开头用过程调用来执行此操作,则VBE假定您引用了一个标签并删除了任何缩进,将该行与左边距对齐(即使该过程按预期调用):

Function Test()
Function1 : Function2
End Function
Run Code Online (Sandbox Code Playgroud)

使用Call语句允许在保持代码缩进的同时连接过程调用:

Function Test()
    Call Function1 : Call Function2
End Function
Run Code Online (Sandbox Code Playgroud)

如果你不使用上面例子中的Call语句,VBE将假定"Function1"是一个标签,并在代码窗口中保持对齐,即使它不会导致错误.

  • 对于legitimage案例+1 ...虽然我认为在一行上有多个指令/函数调用是一种不好的做法. (19认同)

Mar*_*urd 11

对于VB6,如果有可能将它转换为VB.NET,使用Call意味着语法不会改变.(在VB.NET中需要使用括号进行方法调用.)(我个人认为这不值得这么做 - 任何.NET转换器至少能够在需要时放入括号.我只是将其列为一个原因.)

否则它只是语法糖.

注意,Call当调用其他方法/函数时,关键字可能不会更快,因为函数无论如何都返回它的值,并且VB不需要创建一个局部变量来接收它,即使Call没有使用它也是如此.


Nic*_*zer 10

我总是Call在VBA中使用.对我来说,它看起来更干净.但是,我同意,这只是语法糖,这正是个人偏好的范畴.在过去的几年里,我遇到了大约十几个全职VBA球员,并没有使用其中一个Call.这有一个额外的好处,我总是知道哪些代码是我的.:p