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

Объявление процедуры определяет механизм передачи. Если параметр объявлен 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

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

См. также