我在看VB6代碼,我看到如下語句 -是否有可能在沒有括號的情況下調用VB函數?
Public Sub CheckXYZ(abc As Integer)
If abc <> pqr Then SetVars abc
當我點擊轉到定義上SetVars,我採取了以下定義 -
Private Sub SetVars(i As Integer)
我對VB來說是新的。這是在VB中常見的東西,允許沒有palenthesis的函數調用?
我在看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