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, o Visual Basic faz uma cópia local de cada argumento passado ByVal. Se um procedimento declarar um parâmetro como ByRef, o Visual Basic fornecerá ao 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 de procedimento poderá usar a referência direta para alterar o valor do elemento no código de chamada.
Alterar 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 o argumento.
No código de chamada, não coloque o argumento entre parênteses na lista de argumentos.
No código de 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.
Alterar 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 desse argumento.
Para alterar a cópia de um argumento de procedimento no código do procedimento
Na declaração de procedimento, especifique ByVal para o parâmetro correspondente ao argumento.
-ou-
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 que o parâmetro correspondente especifique
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 pegam uma variável de matriz e operam em seus elementos. O procedimento increase
simplesmente adiciona um a cada elemento. O procedimento replace
atribui uma nova matriz ao parâmetro a()
e adiciona um 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 chamada MsgBox
exibe "Após o aumento(n): 11, 21, 31, 41". Como a matriz n
é um tipo de referência, replace
pode alterar seus membros, mesmo que o mecanismo para passar argumentos seja ByVal
.
A segunda chamada MsgBox
exibe "Após substituir(n): 101, 201, 301". Como n
é passado ByRef
, replace
pode modificar a variável n
no código de chamada e atribuir uma nova matriz a ela. Como n
é 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 palavra-chave ByRef
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 com cada parâmetro declarado. Isso facilita a leitura do seu código.
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. Verifique se você espera que esse valor seja alterado e esteja preparado para verificar sua validade antes de usá-lo.
Confira também
- Procedimentos
- Parâmetros e Argumentos de Procedimento
- Como passar argumentos para um procedimento
- Passar 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 nome
- Tipos de Valor e Tipos de Referência