Что делает ключевое слово Call в VB6?

33

В нашем проекте есть некоторый код, который выглядит примерно так:

Private Sub Method1()
    Call InnerMethod
End Sub

Private Sub Method2()
    InnerMethod
End Sub

Private Sub InnerMethod()
    '' stuff
End Sub

В чем преимущество использования метода 1 над методом2?

Теги:
vb6
syntax

5 ответов

37
Лучший ответ

Из MSDN:

Вам не требуется использовать вызов при вызове процедуры. Однако, если вы используете ключевое слово Call для вызова процедуры, которая требует аргументы, список аргументов должен быть заключенные в круглые скобки. Если вы опустите ключевое слово Call, вы также должны опустить круглые скобки вокруг списка аргументов. Если для вызова используется синтаксис вызова любой встроенный или определяемый пользователем функция, возвращаемое значение функции отбрасывается.

Например:

Sub Proc1()
    Debug.Print "Hello World"
End Sub

Sub Proc2(text As String)
    Debug.Print "Hello " & text
End Sub

В непосредственном окне, если вы введете

Proc1

а затем печать "Hello World" . Если вы введете

Call Proc1

а затем печать "Hello World" . Если вы введете

Proc2 "World"

а затем печать "Hello World" . Если вы введете

Call Proc2 "World" 

появляется ошибка компиляции. Вам нужно будет ввести

Call Proc2("World")
11

Вызов не делает ничего особенного, кроме вызова метода. Это зависание от старых дней Basic, когда все строки должны были начинаться с ключевого слова. "Let" - это еще одно из этих ключевых слов, которое всегда было поставлено перед назначением, но больше не требуется.

Метод 1 и Метод2 делают то же самое.

5

Я обнаружил существенное различие в ключевом слове "call" с функциями, имеющими ByRef Arguments (я нашел это в редакторе VBA MS-Access). Если вы вызываете функцию без ключевого слова "Вызов", ByRef aruments не будет установлен для calle. Для Ex:

Private Function Test(Optional ByRef refArg As String) As Boolean    
    refArg = "Test"
    Test = True
End Function

Если вы вызываете функцию без ключевого слова Call

Dim a As String
Test(a)

a будет пустой строкой, после возврата вызова

Если вы вызываете функцию с ключевым словом Call например

Dim a As String
Call Test(a)

a будет содержать строку Test

Подробное объяснение представлено в следующей ссылке: http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx

  • 5
    Два не эквивалентны. В первом случае заключение аргумента в паренсы приводит к его оценке и результату оценки: в сущности, вы передаете копию «а», а не «а». Это становится очевидным парсером. Когда вы вводите Test (a) и покидаете строку, синтаксический анализатор добавляет пробел, делая его Test (a), чтобы указать, что это выражение; тогда как с Call Test (a) пробел не будет добавлен - вы передаете «a» напрямую. Смотрите ответ Патрика Каффа выше для ссылки на документ.
  • 0
    Действительно, и фактически получение результата (например, MsgBox Test(a) ) восстанавливает эквивалентность.
2

Здесь post, который описывает, когда вам нужно использовать вызов vs, не используя его, и когда в круглые скобки вокруг ваших параметров.

Вы также можете узнать больше о вызов из MSDN. По сути, основное различие заключается в том, что при использовании вызова для вызова функции вы не можете получить возвращаемое значение.

2

Нет никакой разницы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню