Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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. Isso permite que o procedimento altere o valor subjacente ao argumento no código de chamada. Em alguns casos, o código de chamada pode querer proteger contra essa alteração.
Você sempre pode proteger um argumento contra alteração declarando o parâmetro byVal correspondente no procedimento. Se você quiser poder alterar um determinado argumento em alguns casos, mas não em outros, poderá declará-lo e permitir que ByRef
o código de chamada determine o mecanismo de passagem em cada chamada. Ele faz isso colocando o argumento correspondente entre parênteses para passá-lo por valor ou não colocá-lo entre parênteses para passá-lo por referência. Para obter mais informações, consulte Como forçar um argumento a ser passado por valor.
Exemplo
O exemplo a seguir mostra dois procedimentos que pegam 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 adiciona uma a cada elemento. No entanto, a reatribuição não afeta a variável de matriz subjacente no código de chamada.
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(ByVal 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, increase
pode alterar seus membros, mesmo que o mecanismo de passagem seja ByVal
.
A segunda chamada MsgBox
exibe "Após substituir(n): 11, 21, 31, 41". Como n
é passado ByVal
, replace
não é possível modificar a variável n
no código de chamada atribuindo uma nova matriz a ela. Quando replace
cria a nova instância de matriz k
e a atribui à variável local a
, ela perde a referência a n
passada pelo código de chamada. Quando altera os membros de a
, somente a matriz k
local é afetada. Portanto, replace
não incrementa os valores da matriz n
no código de chamada.
Compilar o código
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 código.
Consulte 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 alterar o valor de um argumento de procedimento
- Como fazer: forçar um argumento a ser passado por valor
- Passando argumentos por posição e por nome
- Tipos de Valores e Tipos de Referências