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

Cod*_*lue 4 vb6

我正在看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的函数调用吗?

GTG*_*GTG 8

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

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

  • 你也可以写*Call AddOne(i)*"call"关键字表示括号是必需的 (5认同)

Mat*_*lko 5

这是VB6的一个特性(很高兴在VB.NET中被删除)并且是合法的语法.

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

(请参阅此处的MS文档)

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

SomeSubName (abc)

这会提醒您事情出错(即abc,如果被强制通过ByVal),那么您需要使用Call并且空间将被删除:

Call SomeSubName(abc)

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

在极少数情况下你想要强制abc传递ByVal你可以做到这一点,这使得它更加明显:

Call SomeSubName((abc))