是否有可能在没有括号的情况下调用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的函数调用?
正如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
所以,要小心你如何使用括号,小的改变可能会产生意想不到的效果。
带参数的子呼叫不需要括号。只有在函数返回结果时才需要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语句的地方,它会使其在所有其他调用中都更加突出。如果我活得够长,我需要使用它。 :)
相关:http://stackoverflow.com/q/8070033/11683,http://stackoverflow.com/q/6331106/11683,http://stackoverflow.com/q/8257088/11683 – GSerg 2012-04-11 15:48:21