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


Практическое руководство. Принудительная передача аргумента по значению

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

Алгоритм передачи определяется в объявлении процедуры. Если параметр объявляется как ByRef, то Visual Basic ожидает передачи соответствующего аргумента по ссылке. Это позволяет процедуре изменять значение элемента программирования, содержащегося в аргументе кода вызова. Если необходимо защитить основные элементы от таких изменений, можно переопределить механизм передачи ByRef в процедуре, заключив имя аргумента в скобки. Эти скобки являются дополнением к круглым скобкам, содержащим список аргументов в вызове.

Код вызова не может переопределить механизм ByVal.

Принудительная передача аргумента по значению

  • Если соответствующий параметр объявлен как ByVal в процедуре, то необязательно предпринимать дополнительные действия. Visual Basic уже ожидает передачи аргумента по значению.

  • Если соответствующий параметр объявлен как ByRef в процедуре, заключите аргумент в скобки в вызове процедуры.

Пример

В следующем примере переопределяется объявление параметра ByRef. В вызове, требующем ByVal, обратите внимание на два уровня скобок.

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)

При str, заключенном в дополнительные скобки в списке аргументов, процедуре setNewString не удается изменить его значение в коде вызова, и отображается MsgBox "Cannot be replaced if passed ByVal". При str, не заключенном в дополнительные скобки, процедура может его изменить и MsgBox отображает "This is a new value for the inString argument".

Компиляция кода

Если переменная передается по ссылке, для выбора этого способа необходимо использовать ключевое слово ByRef.

По умолчанию в Visual Basic для передачи аргументов используется передача по значению. Однако использование ключевых слов ByVal или ByRef с каждым объявленным параметром — это хороший стиль программирования. Это облегчает считывание кода.

Отказоустойчивость

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

Безопасность

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

См. также

Задачи

Практическое руководство. Передача аргументов в процедуру

Практическое руководство. Изменение значения аргумента процедуры

Практическое руководство. Защита аргумента процедуры от изменения значения

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

Процедуры в Visual Basic

Параметры и аргументы процедуры

Передача аргументов по значению или по ссылке

Различия между аргументами Modifiable и Nonmodifiable

Различия между передачей аргумента по значению и по ссылке

Передача аргумента по позиции и по имени

Типы значений и ссылочные типы