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
Na declaração de procedimento, especifique ByRef para o parâmetro correspondente ao argumento.
No código de chamada, passe um elemento de programação modificável como argumento.
No código de chamada, não coloque o argumento entre parênteses na lista de argumentos.
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
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
.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
- Procedimentos
- Parâmetros e argumentos do procedimento
- Como: Passar argumentos para um procedimento
- Passando argumentos por valor e por referência
- Diferenças entre argumentos modificáveis e não modificáveis
- Diferenças entre passar um argumento por valor e por referência
- Como: Proteger um argumento de procedimento contra alterações de valor
- Como: Forçar um argumento a ser passado por valor
- Passando argumentos por posição e por nome
- Tipos de valor e tipos de referência