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


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

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

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

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

  • Если соответствующий параметр объявлен как 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 (Visual Basic) или ByRef (Visual Basic) с каждым объявленным параметром — это хороший стиль программирования.Это облегчает чтение кода.

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

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

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

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

См. также

Задачи

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

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

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

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

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

Параметры и аргументы процедуры (Visual Basic)

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

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

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

Передача аргументов по позиции и по имени (Visual Basic)

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