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