4

我正在查看 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 中很常见,允许在没有括号的情况下调用函数吗?

4

4 回答 4

8

正如 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

所以要注意你如何使用括号,一个小的改变可能会产生意想不到的效果。

于 2012-04-11T14:53:49.573 回答
4

这是 VB6 的一项功能(很高兴在 VB.NET 中取消了该功能),并且是合法的语法。

但是我不建议使用它,因为它会使代码更难阅读,并且正如@GTG 指出的那样,如果您不小心,当方法声明为 ByRef 时会强制执行 ByVal。

(请参阅此处的 MS 文档)

因此,我的建议是始终使用括号。如果您在方法名称和第一个括号之间看到一个空格,如下所示:

SomeSubName (abc)

这会提醒您有问题(即 abc 如果被迫通过ByVal),因此您需要使用Call并且空间将被删除:

Call SomeSubName(abc)

这使您的所有方法调用在您的代码中保持一致。

在极少数情况下您强制abc通过ByVal,您可以这样做,这使得它更加明显:

Call SomeSubName((abc))

于 2012-04-12T10:28:03.193 回答
2

带参数的子调用不需要括号。只有返回结果的函数才需要括号。

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
于 2012-04-11T14:19:59.597 回答
0

我个人不使用也不推荐使用 Call 语句。我个人发现,具有功能的括号和缺少 subs 的括号有效地区分了两者。也就是说,我真的很喜欢 Matt 对调用语句/byval/double parens 的使用。在极少数情况下,当您需要此功能时,如果它是您使用 Call 语句的唯一位置,它会使其在所有其他调用中更加突出。如果我活得足够长,我会使用它。:)

于 2012-04-13T14:04:04.783 回答