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


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

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

См. также