Поделиться через


Механизм передачи параметров для пользователей Visual Basic 6.0

Обновлен: Ноябрь 2007

Visual Basic 2008 вводит некоторые изменения, влияющие на порядок передачи аргументов процедуре.

Механизм передачи по умолчанию

Visual Basic 6.0

В Visual Basic 6.0, если для параметра процедуры не указано ключевое слово ByVal или ByRef, для механизма передачи по умолчанию используется ByRef. Это позволяет изменять в вызывающей программе переменную, переданную в процедуру.

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

Function minutesPastHour(seconds As Integer) As Integer 
    Dim hours As Integer = seconds \ 3600 
    seconds = seconds Mod 3600 
    Return seconds \ 60 
End Function 
Sub showSecondsAndMinutes() 
    Dim elapsedSeconds, extraMinutes As Integer 
    elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight. 
    extraMinutes = minutesPastHour(elapsedSeconds) 
    MsgBox "Total seconds: " & elapsedSeconds & _ 
        "; minutes past hour: " & extraMinutes 
End Sub 

Передача аргумента ByRef разрешает процедуре изменить его в вызывающем коде, что может привести к непредсказуемому поведению. Если же эта процедура вызывает другую процедуру и передает тот же самый аргумент ByRef, вероятность случайного изменения начальной переменной возрастает.

Visual Basic 2008

При объявлении процедуры в Visual Basic 2008 механизм передачи по умолчанию получает аргумент ByVal для каждого параметра. Это защищает аргументы от изменения. Объявление в предыдущем примере может быть переписано следующим образом:

Function MinutesPastHour(ByVal Seconds As Integer) As Integer

Передача аргумента seconds по значению защищает процедуру от доступа к переменной в вызывающей программе и помогает избежать только что описанных ловушек.

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

Аргументы свойства ByRef

Visual Basic 6.0

В Visual Basic 6.0 свойство, переданное процедуре как аргумент ByRef, копируется в процедуру, но не из нее. Это означает, что любое изменение такого аргумента свойства не отражается на первоначальном свойстве в вызывающей программе, даже если он был передан (по ссылке) ByRef.

Visual Basic 2008

В Visual Basic 2008 аргумент свойства, передаваемый (по ссылке) ByRef, копируется как в процедуру, так и из нее. В следующем примере показано, как изменить свойство с помощью процедуры.

Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ...  ' Code to modify Height argument. 
End Sub
Dim Sq As Square = New Square  ' Square has property Side of type Single. 
Reduce(Sq.Side)                ' Side is changed when Reduce returns. 

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

Аргументы ParamArray

Visual Basic 6.0

В Visual Basic 6.0 процедура может указывать ключевое слово ParamArray для конечного аргумента, чтобы принять массив аргументов Variant. Механизм передачи этих аргументов не может быть объявлен. Они всегда передаются (по ссылке) ByRef.

Visual Basic 2008

В Visual Basic 2008 аргументы ParamArray всегда передаются (по значению) ByVal. Все аргументы в массиве должны иметь тип данных аргумента ParamArray.

См. также

Основные понятия

Объявление процедуры для пользователей Visual Basic 6.0

Последовательность вызова процедуры для пользователей Visual Basic 6.0.

Массивы параметров

Сводка изменений поддержки элементов программирования

Ссылки

Оператор Function (Visual Basic)

Оператор Sub (Visual Basic)

ByVal

ByRef

ParamArray