我正在看VB6代码,我看到如下声明 -
Public Sub CheckXYZ(abc As Integer)
If abc <> pqr Then SetVars abc
Run Code Online (Sandbox Code Playgroud)
当我点击SetVars上的定义时,我将采取以下定义 -
Private Sub SetVars(i As Integer)
Run Code Online (Sandbox Code Playgroud)
我是VB的新手.这是VB中常见的东西,允许没有paranthesis的函数调用吗?
正如Ryan指出的那样,只有在调用将返回值的函数时才应使用括号.
我想补充的一个缺陷是,如果你实际上在调用Sub时无意中使用了parenteses,VB6将通过值而不是通过引用传递参数.
当Sub接受多个参数时,这不是风险,因为这是VB6中的非法语法:
SomeFunc (arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
但请考虑这个例子:
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
Run Code Online (Sandbox Code Playgroud)
所以要注意你如何使用括号,一个小的改变可能会产生意想不到的效果.
这是VB6的一个特性(很高兴在VB.NET中被删除)并且是合法的语法.
但是我不建议使用它,因为它可以使代码更难以阅读,因为@GTG指出,如果你不小心,方法声明是ByRef时可以强制ByVal.
因此,我的建议是始终使用括号.如果在方法名称和第一个括号之间看到一个空格,如下所示:
SomeSubName (abc)
这会提醒您事情出错(即abc,如果被强制通过ByVal),那么您需要使用Call并且空间将被删除:
Call SomeSubName(abc)
这使您的所有方法调用在代码中保持一致.
在极少数情况下你想要强制abc传递ByVal你可以做到这一点,这使得它更加明显:
Call SomeSubName((abc))