是否可以在没有括号的情况下调用VB函数?

时间:2012-04-11 13:47:55

标签: vb6

我正在查看VB6代码,我看到如下声明 -

       Public Sub CheckXYZ(abc As Integer)

       If abc <> pqr Then SetVars abc

当我点击SetVars上的定义时,我将采用以下定义 -

      Private Sub SetVars(i As Integer)

我是VB新手。这是VB中常见的东西,允许没有paranthesis的函数调用吗?

4 个答案:

答案 0 :(得分:8)

正如Ryan指出的那样,只有在调用将返回值的函数时才应使用括号。

我想补充的一个缺陷是,如果你实际上在调用Sub时无意中使用了parenteses,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

因此,请注意如何使用括号,一个小的改动可能会产生意想不到的效果。

答案 1 :(得分:4)

这是VB6的功能(很高兴在VB.NET中被删除)并且是合法的语法。

但是我不推荐使用它,因为它可以使代码更难以阅读,并且@GTG指出当方法声明为ByRef时如果你不小心,可以强制ByVal。

(See the MS Documentation about this here)

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

SomeSubName (abc)

这会提醒您注意某些事情是错误的(即,如果被强制传递ByVal则为abc),因此您需要使用Call并且空格将被移除:

Call SomeSubName(abc)

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

在您希望强制abc传递ByVal的罕见情况下,您可以执行此操作,这会使其更加明显:

Call SomeSubName((abc))

答案 2 :(得分: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

答案 3 :(得分:0)

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