Como: Proteger um argumento de procedimento contra alterações de valor
Se um procedimento declara um parâmetro sistema autônomo ByRef, Visual Basic o código do procedimento fornece uma referência direta para o elemento de programação subjacente do argumento no código de chamada. Isso permite que o procedimento para alterar o valor subjacente do argumento no código de chamada.Em alguns casos, o código de chamada talvez queira proteger contra essa alterar.
Você sempre pode proteger um argumento de alterar, declarando o parâmetro correspondente ByVal no procedimento. Se você deseja ser capaz de alterar um determinado argumento em alguns casos, mas não outros, você pode declará-lo ByRef e deixe que o código de telefonar determinar o mecanismo para passar argumentos em cada telefonar. Ele faz isso incluindo o argumento correspondente entre parênteses para passá-lo por valor ou não envolve em parênteses para passar por referência.Para obter mais informações, consulte Como: Forçar um argumento para ser passada por valor.
Exemplo
O exemplo a seguir mostra dois procedimentos que tenham uma variável de matriz e operam em seus elementos.O procedimento increase simplesmente adiciona um para cada elemento.O procedimento replace atribui o parâmetro a() uma nova matriz e, em seguida, adiciona um para cada elemento.No entanto, a reatribuição não afeta a matriz variável 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)))
O primeiro MsgBoxtelefonar Exibe "após increase(n): 11, 21, 31, 41".Porque a matriz n é um tipo de referência, replace pode alterar seus membros, mesmo que ByVal seja a mecanismo de passagem.
O segundo MsgBoxtelefonar Exibe "após substituir(n): 11, 21, 31, 41".Porque n é passado ByVal, replace não é possível modificar a variável n no código de chamada, atribuindo um novo array. Quando replace cria a nova instância de array k e a atribui para a variável local a,ele perde a referência à n passada pelo código de chamada.Quando ele se transformar os membros de a, apenas o array local k é afetado. Portanto, replace não incrementa os valores de matriz n no código de chamada.
Compilando o código
O padrão no Visual Basic é passar argumentos por valor.No entanto, é boa prática de programação incluir a palavra-chave ByVal ou ByRef com cada parâmetro declarado.Isso facilita a leitura seu código.
Consulte também
Tarefas
Como: Passar argumentos para um procedimento
Como: Alterar o valor de um argumento de procedimento
Como: Forçar um argumento para ser passada por valor
Conceitos
Parâmetros do procedimento e argumentos
Argumento Passing By 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