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

См. также