我正在查看 VB6 代码,我看到如下语句 -
Public Sub CheckXYZ(abc As Integer)
If abc <> pqr Then SetVars abc
当我单击 SetVars 上的 go to definition 时,我被带到以下定义 -
Private Sub SetVars(i As Integer)
我是 VB 的新手。这在 VB 中很常见,允许在没有括号的情况下调用函数吗?
我正在查看 VB6 代码,我看到如下语句 -
Public Sub CheckXYZ(abc As Integer)
If abc <> pqr Then SetVars abc
当我单击 SetVars 上的 go to definition 时,我被带到以下定义 -
Private Sub SetVars(i As Integer)
我是 VB 的新手。这在 VB 中很常见,允许在没有括号的情况下调用函数吗?
正如 Ryan 所指出的,括号只能在调用将返回值的函数时使用。
我想补充的一个陷阱是,如果您在调用 Sub 时确实无意中使用了双亲,VB6 将通过值而不是通过引用传递参数。
当 Sub 接受多个参数时,这不是风险,因为这是 VB6 中的非法语法:
SomeFunc (arg1, arg2)
但是考虑这个例子:
Sub AddOne(ByRef i As Integer)
i = i + 1
End Sub
Sub Command1_Click()
Dim i as Integer
i = 1
AddOne i 'i will be passed by reference and increased by 1
Msgbox i 'Will print "2"
AddOne (i) 'i will be passed by value, so the return value will be lost!!
MsgBox i 'Will still print "2"!!
End Sub
所以要注意你如何使用括号,一个小的改变可能会产生意想不到的效果。
这是 VB6 的一项功能(很高兴在 VB.NET 中取消了该功能),并且是合法的语法。
但是我不建议使用它,因为它会使代码更难阅读,并且正如@GTG 指出的那样,如果您不小心,当方法声明为 ByRef 时会强制执行 ByVal。
因此,我的建议是始终使用括号。如果您在方法名称和第一个括号之间看到一个空格,如下所示:
SomeSubName (abc)
这会提醒您有问题(即 abc 如果被迫通过ByVal
),因此您需要使用Call
并且空间将被删除:
Call SomeSubName(abc)
这使您的所有方法调用在您的代码中保持一致。
在极少数情况下您想强制abc
通过ByVal
,您可以这样做,这使得它更加明显:
Call SomeSubName((abc))
带参数的子调用不需要括号。只有返回结果的函数才需要括号。
Private Sub Testy1()
Function1 "Testy2" ' does not require parenthesis
Debug.Print Function1("Testy3") ' does require parenthesis
End Sub
Private Function Function1(str as String) as Boolean
Function1 = True
End Function
我个人不使用也不推荐使用 Call 语句。我个人发现,具有功能的括号和缺少 subs 的括号有效地区分了两者。也就是说,我真的很喜欢 Matt 对调用语句/byval/double parens 的使用。在极少数情况下,当您需要此功能时,如果它是您使用 Call 语句的唯一位置,它会使其在所有其他调用中更加突出。如果我活得足够长,我会使用它。:)