Практическое руководство. Изменение значения аргумента процедуры
Обновлен: Ноябрь 2007
При вызове процедуры каждый аргумент соответствует одному из параметров, определенных в процедуре. В некоторых случаях код процедуры может изменять значение основного аргумента в вызывающем коде. В других случаях процедура может изменять только его локальную копию.
При вызове процедуры Visual Basic создает локальную копию каждого аргумента, который передается ByVal. Для каждого передаваемого аргумента ByRefVisual Basic предоставляет для кода процедуры прямую ссылку на элемент программирования, содержащегося в аргументе в вызывающем коде.
Если базовый элемент вызывающего кода является изменяемым, и аргумент передается ByRef, то код процедуры позволяет изменить значение элемента в коде вызова при помощи прямой ссылки.
Изменение базового значения
Для изменения базового значения аргумента процедуры в коде вызова
В объявлении процедуры укажите ByRef для параметра, соответствующего аргументу.
В вызывающем коде передайте изменяемый элемент программирования в качестве аргумента.
В вызывающем коде не заключайте аргумент в список аргументов в скобках.
В коде процедуры используйте имя параметра для присвоения значения базовому элементу в вызывающем коде.
Посмотрите следующий пример.
Изменение локальных копий
Если базовый элемент в вызывающем коде является неизменяемым или аргумент передается ByVal, то процедура не может изменять его значение в вызывающем коде. Однако процедура может изменить локальную копию такого аргумента.
Чтобы изменить копию аргумента процедуры в коде процедуры
В объявлении процедуры укажите ByVal для параметра, соответствующего аргументу.
либо
В вызывающем коде заключите аргумент в список аргументов в скобках. Это указывает 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 отображается "После увеличения (n): 11, 21, 31, 41". Поскольку массив n является ссылочным типом, replace может изменять его элементы, даже если механизм передачи принимает значение ByVal.
При втором вызове MsgBox отображается "После замены(n): 101, 201, 301". Поскольку n передан ByRef, replace может изменить переменную n в вызывающем коде и присвоить ей новый массив. Поскольку n является ссылочным типом, replace может изменять его члены.
Можно запретить процедуре изменять переменную в вызывающем коде. См. раздел Практическое руководство. Защита аргумента процедуры от изменения значения.
Компиляция кода
Если переменная передается по ссылке, для выбора этого способа необходимо использовать зарезервированное слово ByRef.
По умолчанию в Visual Basic для передачи аргументов используется передача по значению. Однако использование ключевых слов ByVal или ByRef с каждым объявленным параметром — это хороший стиль программирования. Это облегчает считывание кода.
Безопасность
Всегда есть потенциальный риск при разрешении процедуре изменять значение базового аргумента в вызывающем коде. Проверьте, что значение будет изменено, и будьте готовы к проверке его допустимости перед использованием.
См. также
Задачи
Практическое руководство. Передача аргументов в процедуру
Практическое руководство. Защита аргумента процедуры от изменения значения
Практическое руководство. Принудительная передача аргумента по значению
Основные понятия
Параметры и аргументы процедуры
Передача аргументов по значению или по ссылке
Различия между аргументами Modifiable и Nonmodifiable
Различия между передачей аргумента по значению и по ссылке