Partilhar via


Como alterar o valor de um argumento de procedimento (Visual Basic)

Quando você chama um procedimento, cada argumento fornecido corresponde a um dos parâmetros definidos no procedimento. Em alguns casos, o código de procedimento pode alterar o valor subjacente a um argumento no código de chamada. Em outros casos, o procedimento pode alterar apenas sua cópia local de um argumento.

Quando você chama o procedimento, Visual Basic faz uma cópia local de cada argumento que é passado ByVal. Para cada argumento passado ByRef, Visual Basic fornece o código de procedimento uma referência direta ao elemento de programação subjacente ao argumento no código de chamada.

Se o elemento subjacente no código de chamada for um elemento modificável e o argumento for passado ByRef, o código do procedimento poderá usar a referência direta para alterar o valor do elemento no código de chamada.

Alterando o valor subjacente

Para alterar o valor subjacente de um argumento de procedimento no código de chamada

  1. Na declaração de procedimento, especifique ByRef para o parâmetro correspondente ao argumento.

  2. No código de chamada, passe um elemento de programação modificável como argumento.

  3. No código de chamada, não coloque o argumento entre parênteses na lista de argumentos.

  4. No código do procedimento, use o nome do parâmetro para atribuir um valor ao elemento subjacente no código de chamada.

Veja o exemplo mais abaixo para uma demonstração.

Alterando cópias locais

Se o elemento subjacente no código de chamada for um elemento não modificável, ou se o argumento for passado ByVal, o procedimento não poderá alterar seu valor no código de chamada. No entanto, o procedimento pode alterar sua cópia local de tal argumento.

Para alterar a cópia de um argumento de procedimento no código de procedimento

  1. Na declaração de procedimento, especifique ByVal para o parâmetro correspondente ao argumento.

    -or-

    No código de chamada, coloque o argumento entre parênteses na lista de argumentos. Isso força o Visual Basic a passar o argumento por valor, mesmo se o parâmetro correspondente especificar ByRef.

  2. No código do procedimento, use o nome do parâmetro para atribuir um valor à cópia local do argumento. O valor subjacente no código de chamada não é alterado.

Exemplo

O exemplo a seguir mostra dois procedimentos que usam uma variável de matriz e operam em seus elementos. O increase procedimento simplesmente adiciona um a cada elemento. O replace procedimento atribui uma nova matriz ao parâmetro a() e, em seguida, adiciona uma a cada elemento.

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)))

A primeira MsgBox chamada exibe "Após aumento(n): 11, 21, 31, 41". Como a matriz n é um tipo de referência, replace pode alterar seus membros, mesmo que o mecanismo de passagem seja ByVal.

A segunda MsgBox chamada exibe "Após substituição(n): 101, 201, 301". Porque n é passado ByRef, replace pode modificar a variável n no código de chamada e atribuir uma nova matriz a ele. Por n ser um tipo de referência, replace também pode alterar seus membros.

Você pode impedir que o procedimento modifique a própria variável no código de chamada. Consulte Como: Proteger um argumento de procedimento contra alterações de valor.

Compilar o código

Ao passar uma variável por referência, você deve usar a ByRef palavra-chave para especificar esse mecanismo.

O padrão no Visual Basic é passar argumentos por valor. No entanto, é uma boa prática de programação incluir a palavra-chave ByVal ou ByRef em cada parâmetro declarado. Isso torna seu código mais fácil de ler.

Segurança do .NET Framework

Há sempre um risco potencial em permitir que um procedimento altere o valor subjacente a um argumento no código de chamada. Certifique-se de que espera que este valor seja alterado e esteja preparado para verificar a sua validade antes de o utilizar.

Consulte também