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


Как заставить аргумент передаваться по значению (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

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

См. также