Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Объявление процедуры задает механизм передачи. Если параметр объявлен 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
выводит сообщение "Невозможно заменить при передаче ByVal". Если str
не заключён в дополнительные скобки, процедура может изменить его, а MsgBox
отображает "Это новое значение для аргумента inString".
Компиляция кода
При передаче переменной по ссылке необходимо использовать ByRef
ключевое слово для указания этого механизма.
Значение по умолчанию в Visual Basic — передавать аргументы по значению. Однако рекомендуется включить ключевое слово ByVal или ByRef с каждым объявленным параметром. Это упрощает чтение кода.
Надежное программирование
Если процедура объявляет параметр ByRef, правильное выполнение кода может зависеть от возможности изменить базовый элемент в вызывающем коде. Если вызывающий код переопределяет этот механизм вызова, заключив аргумент в скобки или если он передает немодируемый аргумент, процедура не может изменить базовый элемент. Это может привести к непредвиденным результатам в вызывающем коде.
Безопасность .NET Framework
Всегда существует потенциальный риск позволить процедуре изменить основное значение аргумента в вызывающем коде. Убедитесь, что вы ожидаете, что это значение будет изменено, и будьте готовы проверить его на допустимость перед его использованием.
См. также
- процедуры
- Параметры процедуры и аргументы
- Как передавать аргументы в процедуру
- Передача аргументов по значению и по ссылке
- Различия между модификируемыми и неизменяемыми аргументами
- Различия между передачей аргумента по значению и по ссылке
- Практическое руководство. Изменение значения аргумента процедуры
- Практическое руководство. Защита аргумента процедуры от изменений значений
- Передача аргументов по позиции и по имени
- Типы значений и ссылочные типы