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

问题描述:

我在看VB6代码,我看到如下语句 -是否有可能在没有括号的情况下调用VB函数?

 Public Sub CheckXYZ(abc As Integer) 

     If abc <> pqr Then SetVars abc 

当我点击转到定义上SetVars,我采取了以下定义 -

 Private Sub SetVars(i As Integer) 

我对VB来说是新的。这是在VB中常见的东西,允许没有palenthesis的函数调用?

+2

相关:http://*.com/q/8070033/11683,http://*.com/q/6331106/11683,http://*.com/q/8257088/11683 – GSerg 2012-04-11 15:48:21

正如Ryan所指出的,括号只能在调用函数返回值时使用。

我想补充的一个缺陷是,如果你实际上在调用Sub时无意中使用了parenteses,VB6会通过值而不是参考来传递参数。

当子需要一个以上的参数,这不是一个风险,因为这是非法的语法在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 

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

+0

谢谢为了解释! – CodeBlue 2012-04-11 15:53:02

+4

你也可以写* Call AddOne(i)*“call”关键字表示括号是必需的 – MarkJ 2012-04-11 17:06:07

带参数的子呼叫不需要括号。只有在函数返回结果时才需要Paranthesis。

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 

这是VB6的一个功能(很高兴在VB.NET中拿走了一个),它是合法的语法。

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

(See the MS Documentation about this here)

因此我的建议是总是使用括号。如果你看到这样的方法名称和第一支架之间的空间:

SomeSubName (abc)

此提醒您这样的事实,什么是错的(即ABC,如果*要传递ByVal),所以你需要使用Call和空间将被删除:

Call SomeSubName(abc)

这使得所有的方法调用代码中是一致的。

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

Call SomeSubName((abc))

我不亲自使用或推荐使用呼叫声明。我个人发现,具有功能和缺乏功能的零件有效区分了两者。也就是说,我真的很喜欢Matt对call/statement/byval/double parens的使用。在极少数情况下,当你想要这样做时,如果它是唯一使用Call语句的地方,它会使其在所有其他调用中都更加突出。如果我活得够长,我需要使用它。 :)