我正在查看VB6代码,我看到如下声明 -
Public Sub CheckXYZ(abc As Integer)
If abc <> pqr Then SetVars abc
当我点击SetVars上的定义时,我将采用以下定义 -
Private Sub SetVars(i As Integer)
我是VB新手。这是VB中常见的东西,允许没有paranthesis的函数调用吗?
答案 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语句的唯一地方,它会使其在所有其他调用中更加突出。如果我活得足够长,我会用它。 :)