Поделиться через


Практическое руководство. Защита аргумента процедуры от изменения значения (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)

Передача аргументов по значению и по ссылке (Visual Basic)

Различия между аргументами Modifiable и Nonmodifiable (Visual Basic)

Различия между передачей аргумента по значению и по ссылке (Visual Basic)

Передача аргументов по позиции и по имени (Visual Basic)

Типы значений и ссылочные типы