Практическое руководство. Изменение значения аргумента процедуры (Visual Basic)
При вызове процедуры каждый аргумент соответствует одному из параметров, определенных в процедуре.В некоторых случаях код процедуры может изменять значение основного аргумента в вызывающем коде.В других случаях процедура может изменять только его локальную копию.
При вызове процедуры Visual Basic создает локальную копию каждого аргумента, который передается ByVal (Visual Basic).Для каждого передаваемого аргумента ByRef (Visual Basic) Visual Basic предоставляет для кода процедуры прямую ссылку на элемент программирования, содержащегося в аргументе в вызывающем коде.
Если базовый элемент вызывающего кода является изменяемым, и аргумент передается ByRef, то код процедуры позволяет изменить значение элемента в коде вызова при помощи прямой ссылки.
Изменение базового значения
Для изменения базового значения аргумента процедуры в коде вызова
В объявлении процедуры укажите ByRef (Visual Basic) для параметра, соответствующего аргументу.
В вызывающем коде передайте изменяемый элемент программирования в качестве аргумента.
В вызывающем коде не заключайте аргумент в список аргументов в скобках.
В коде процедуры используйте имя параметра для присвоения значения базовому элементу в вызывающем коде.
Посмотрите следующий пример.
Изменение локальных копий
Если базовый элемент в вызывающем коде является неизменяемым или аргумент передается ByVal, то процедура не может изменять его значение в вызывающем коде.Однако процедура может изменить локальную копию такого аргумента.
Чтобы изменить копию аргумента процедуры в коде процедуры
В объявлении процедуры укажите ByVal (Visual Basic) для параметра, соответствующего аргументу.
-или-
В вызывающем коде заключите аргумент в список аргументов в скобках.Это указывает Visual Basic передавать аргумент по значению, даже если соответствующий параметр указывает ByRef.
В коде процедуры используйте имя параметра для присвоения значения локальной копии аргумента.Основное значение в коде вызова не изменяется.
Пример
В следующем примере показаны две процедуры, которые принимают переменную массива и производят действия над его элементами.Процедура increase добавляет единицу к каждому элементу.Процедура replace присваивает новый массив параметру a() и добавляет единицу к каждому элементу.
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByRef a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Первый вызов MsgBox выводит следующее: "After increase(n): 11, 21, 31, 41".Так как массив n является ссылочным типом, replace может изменить его элементы, несмотря на механизм передачи ByVal.
Второй вызов MsgBox выводит следующее: "After replace(n): 101, 201, 301".Так как объект n передается механизмом ByRef, replace может изменить переменную n в вызывающем коде и присвоить ей новый массив.Поскольку n является ссылочным типом, replace может изменять его члены.
Можно запретить процедуре изменять переменную в вызывающем коде.См. раздел Практическое руководство. Защита аргумента процедуры от изменения значения (Visual Basic).
Компиляция кода
Если переменная передается по ссылке, для выбора этого способа необходимо использовать ключевое слово ByRef.
По умолчанию в Visual Basic для передачи аргументов используется передача по значению.Однако использование ключевых слов ByVal (Visual Basic) или ByRef (Visual Basic) с каждым объявленным параметром — это хороший стиль программирования.Это облегчает чтение кода.
Безопасность
Всегда есть потенциальный риск при разрешении процедуре изменять значение базового аргумента в вызывающем коде.Проверьте, что значение будет изменено, и будьте готовы к проверке его допустимости перед использованием.
См. также
Задачи
Практическое руководство. Передача аргументов в процедуру (Visual Basic)
Практическое руководство. Защита аргумента процедуры от изменения значения (Visual Basic)
Практическое руководство. Принудительная передача аргумента по значению (Visual Basic)
Основные понятия
Параметры и аргументы процедуры (Visual Basic)
Передача аргументов по значению и по ссылке (Visual Basic)
Различия между аргументами Modifiable и Nonmodifiable (Visual Basic)
Различия между передачей аргумента по значению и по ссылке (Visual Basic)