Практическое руководство. Принудительная передача аргумента по значению (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)
Различия между аргументами Modifiable и Nonmodifiable (Visual Basic)
Различия между передачей аргумента по значению и по ссылке (Visual Basic)