Прочитать на английском

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


Практическое руководство. Защита аргумента процедуры от изменений значений (Visual Basic)

Если процедура объявляет параметр как ByRef, Visual Basic предоставляет код процедуры прямую ссылку на элемент программирования, лежащий в основе аргумента в вызывающем коде. Это позволяет процедуре изменить основное значение аргумента в вызывающем коде. В некоторых случаях вызывающий код может потребоваться защитить от такого изменения.

Вы всегда можете защитить аргумент от изменения, объявив соответствующий параметр ByVal в процедуре. Если вы хотите изменить заданный аргумент в некоторых случаях, но не другие, можно объявить его ByRef и позволить вызывающему коду определить механизм передачи в каждом вызове. Это делается, заключив соответствующий аргумент в скобки, чтобы передать его по значению, или оставив его без скобок, чтобы передать его по ссылке. Дополнительные сведения см. в разделе «Как: принудительно передать аргумент по значению».

Пример

В следующем примере показаны две процедуры, которые принимают переменную массива и работают с его элементами. Процедура increase просто добавляет один к каждому элементу. Процедура replace назначает новый массив параметру a() , а затем добавляет один к каждому элементу. Однако переназначение не влияет на базовую переменную массива в вызывающем коде.

VB
Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
VB
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
VB
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 с каждым объявленным параметром. Это упрощает чтение кода.

См. также


Дополнительные ресурсы

Обучение

Модуль

Создание методов C# с параметрами - Training

В этом модуле рассматриваются параметры метода, включая типы параметров сквозного и сквозного значения. Этот модуль также охватывает необязательные и именованные аргументы.