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

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

Private Sub Method1()
    Call InnerMethod
End Sub

Private Sub Method2()
    InnerMethod
End Sub

Private Sub InnerMethod()
    '' stuff
End Sub

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


person Ant    schedule 26.01.2009    source источник


Ответы (5)


Из MSDN:

Вам не обязательно использовать ключевое слово Call при вызове процедуры. Однако, если вы используете ключевое слово Call для вызова процедуры, требующей аргументов, список аргументов должен быть заключен в круглые скобки. Если вы опускаете ключевое слово 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")
person Patrick Cuff    schedule 26.01.2009

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

Method1 и Method2 делают то же самое.

person Martin Brown    schedule 26.01.2009

Я обнаружил существенное отличие ключевого слова call от функций, имеющих аргументы ByRef (я нашел это в редакторе MS-Access VBA). Если вы вызываете функцию без ключевого слова Call, параметры ByRef не будут установлены для вызываемого объекта. Для 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

person Abraham    schedule 01.07.2010
comment
Эти два понятия не эквивалентны. В первом случае заключение аргумента в скобки приводит к его оценке, и результат оценки передается: по сути, вы передаете копию, а не самого себя. Анализатор делает это очевидным. Когда вы вводите Test (a) и покидаете строку, синтаксический анализатор добавит пробел, сделав Test (a), чтобы указать, что это выражение; тогда как с Call Test (a) пробел добавляться не будет - вы передаете напрямую. См. Ответ Патрика Каффа выше для справки по документу. - person Jim Mack; 02.07.2010
comment
Действительно, и собственно получение результата (например, MsgBox Test(a)) восстанавливает эквивалентность. - person Ant; 05.07.2010
comment
Вы должны удалить этот ответ. Это крайне вводит в заблуждение ... и неправильно. Проголосовали против. Никогда не вызывайте процедуру с круглыми скобками вокруг списка аргументов ... за двумя исключениями: использование ключевого слова Call или выполнение присваивания по результату функции. Вы этого не делаете, поэтому переменная, заключенная в круглые скобки, оценивается и отправляется в процедуру как буквальное значение (а не переменная), и, поскольку она больше не является переменной, нет возможности вернуть обновленное значение. Вам не нужен Call в вашем примере ... вам просто нужно удалить круглые скобки вокруг аргумента: Test a - person Excel Hero; 01.01.2021

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

person James Sun    schedule 26.01.2009

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

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

person JoshBerke    schedule 26.01.2009