Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если процедура объявляет параметр как ByRef, Visual Basic предоставляет код процедуры прямую ссылку на элемент программирования, лежащий в основе аргумента в вызывающем коде. Это позволяет процедуре изменить основное значение аргумента в вызывающем коде. В некоторых случаях вызывающий код может потребоваться защитить от такого изменения.
Вы всегда можете защитить аргумент от изменения, объявив соответствующий параметр ByVal в процедуре. Если вы хотите изменить заданный аргумент в некоторых случаях, но не другие, можно объявить его 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(ByVal 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
является ссылочным типом, increase
может изменить его члены, даже если механизм передачи имеет значение ByVal
.
Второй MsgBox
вызов отображает "После replace(n): 11, 21, 31, 41". Так как n
передается ByVal
, replace
переменная n
в вызывающем коде не может быть изменена, назначив ему новый массив. При создании replace
нового экземпляра k
массива и назначении его локальной переменной a
, теряется ссылка на n
, передаваемую вызывающим кодом. При изменении элементов a
затрагивается только локальный массив k
.
replace
Поэтому не увеличивает значения массива n
в вызывающем коде.
Компиляция кода
Значение по умолчанию в Visual Basic — передавать аргументы по значению. Однако рекомендуется включить ключевое слово ByVal или ByRef с каждым объявленным параметром. Это упрощает чтение кода.
См. также
- процедуры
- Параметры процедуры и аргументы
- Как передавать аргументы в процедуру
- Передача аргументов по значению и по ссылке
- Различия между модификируемыми и неизменяемыми аргументами
- Различия между передачей аргумента по значению и по ссылке
- Практическое руководство. Изменение значения аргумента процедуры
- Как принудительно передать аргумент по значению
- Передача аргументов по позиции и по имени
- Типы значений и ссылочные типы