2012-04-11 93 views
3

我在看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://stackoverflow.com/q/8070033/11683,http://stackoverflow.com/q/6331106/11683,http://stackoverflow.com/q/8257088/11683 – GSerg 2012-04-11 15:48:21

回答

7

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

2

帶參數的子呼叫不需要括號。只有在函數返回結果時才需要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 
4

這是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))

0

我不親自使用或推薦使用呼叫聲明。我個人發現,具有功能和缺乏功能的零件有效區分了兩者。也就是說,我真的很喜歡Matt對call/statement/byval/double parens的使用。在極少數情況下,當你想要這樣做時,如果它是唯一使用Call語句的地方,它會使其在所有其他調用中都更加突出。如果我活得夠長,我需要使用它。 :)

相關問題