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

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

При вызове процедуры Visual Basic создает локальную копию каждого аргумента, передаваемого ByVal. Для каждого аргумента, переданного ByRef, Visual Basic предоставляет код процедуры прямой ссылкой на элемент программирования, лежащий в основе аргумента в вызывающем коде.

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

Изменение базового значения

Изменение базового значения аргумента процедуры в вызывающем коде

  1. В объявлении процедуры укажите ByRef для параметра, соответствующего аргументу.

  2. В вызывающем коде передайте изменяемый элемент программирования в качестве аргумента.

  3. В вызывающем коде не заключайте аргумент в скобки в списке аргументов.

  4. В коде процедуры используйте имя параметра, чтобы назначить значение базовому элементу в вызывающем коде.

Дополнительные сведения см. в примере демонстрации.

Изменение локальных копий

Если базовый элемент в вызывающем коде является неизменяемым элементом или передается ByValаргумент, процедура не может изменить его значение в вызывающем коде. Однако процедура может изменить локальную копию такого аргумента.

Изменение копии аргумента процедуры в коде процедуры

  1. В объявлении процедуры укажите ByVal для параметра, соответствующего аргументу.

    –или–

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

  2. В коде процедуры используйте имя параметра для назначения значения локальной копии аргумента. Базовое значение в вызывающем коде не изменяется.

Пример

В следующем примере показаны две процедуры, которые принимают переменную массива и работают с его элементами. Процедура 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(ByRef 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 является ссылочным типом, replace может изменить его члены, даже если механизм передачи имеет значение ByVal.

Второй MsgBox вызов отображает "После замены(n): 101, 201, 301". Так как n передается ByRef, replace переменная n в вызывающем коде может измениться и назначить ему новый массив. Так как n является ссылочным типом, replace он также может изменять его члены.

Процедуру можно запретить изменять саму переменную в вызывающем коде. Узнайте , как: защитить аргумент процедуры от изменений значений.

Компиляция кода

При передаче переменной по ссылке необходимо использовать ByRef ключевое слово для указания этого механизма.

Значение по умолчанию в Visual Basic — передавать аргументы по значению. Однако рекомендуется включить ключевое слово ByVal или ByRef с каждым объявленным параметром. Это упрощает чтение кода.

Безопасность .NET Framework

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

См. также