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