2012-04-11 5 views
3

Я смотрю на VB6 код, и я вижу заявление следующим образом -Можно ли вызвать функцию VB без скобок?

 Public Sub CheckXYZ(abc As Integer) 

     If abc <> pqr Then SetVars abc 

И когда я нажимаю на перейти к определению на SetVars, я принят к следующему определении как

 Private Sub SetVars(i As Integer) 

I Я новичок в VB. Это что-то общее в VB, чтобы вызвать вызовы функций без парантезы?

+2

http://www.stackoverflow.com/q/8070033/11683, http://stackoverflow.com/q/6331106/11683, http://stackoverflow.com/q/8257088/11683 – GSerg

ответ

7

Как указал Райан, круглые скобки должны использоваться только при вызове функции, которая вернет значение.

Одна ошибка, которую я хотел бы добавить, заключается в том, что если вы на самом деле НЕ НЕПРАВИЛЬНО использовать родительские имена при вызове Sub, 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 

Так быть в курсе о том, как вы используете круглые скобки, небольшое изменение может иметь неожиданный эффект.

+0

Спасибо для объяснения! – CodeBlue

+4

Вы также можете написать * Call AddOne (i) * Ключевое слово «call» означает, что требуются круглые скобки – MarkJ

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, может заставить ByVal, когда объявление метода ByRef, если вы не будете осторожны.

(See the MS Documentation about this here)

В такой мой совет всегда использовать круглые скобки. Если вы видите пробел между именем методы и первой скобкой так:

SomeSubName (abc)

Это предупреждает вас о том, что что-то не так (т.е. а, если вынуждено проходить ByVal), так что вам нужно использовать Call и пространство будут удалены:

Call SomeSubName(abc)

Это делает все ваши вызовы метода последовательной внутри кода.

В тех редких случаях, когда вы хотите заставить abc быть переданы ByVal вы можете сделать это, что делает его гораздо более очевидным:

Call SomeSubName((abc))

0

Я не использую или рекомендуют использовать оператора Call. Я лично нахожу, что параны с функциями и их недостатком с субматеринами эффективно дифференцируют два. Тем не менее, мне очень нравится использование Маттом инструкции вызова/byval/double parens. В редких случаях, когда вы этого хотите, это делает его отличным даже от любого другого вызова, если это единственное место, где вы используете оператор Call. Я собираюсь использовать это, если я живу достаточно долго, чтобы это нужно. :)

Смежные вопросы