Практическое руководство. Принудительная передача аргумента по значению
Обновлен: Ноябрь 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. Если код вызова переопределяет механизм вызова путем заключения аргумента в круглые скобки, или если он передает немодифицируемый аргумент, в процедуре нельзя изменить основной элемент. Это может привести к непредсказуемым результатам в коде вызова.
Безопасность
Всегда есть потенциальный риск при разрешении процедуре изменять значение базового аргумента в вызывающем коде. Проверьте, что значение будет изменено, и будьте готовы к проверке его допустимости перед использованием.
См. также
Задачи
Практическое руководство. Передача аргументов в процедуру
Практическое руководство. Изменение значения аргумента процедуры
Практическое руководство. Защита аргумента процедуры от изменения значения
Основные понятия
Параметры и аргументы процедуры
Передача аргументов по значению или по ссылке
Различия между аргументами Modifiable и Nonmodifiable
Различия между передачей аргумента по значению и по ссылке