Como: Proteger um argumento de procedimento contra alterações de valor (Visual Basic)
Se um procedimento declara um parâmetro como ByRef (Visual Basic), Visual Basic oferece o código do procedimento de uma referência direta ao 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 tal alteração.
Você sempre pode proteger um argumento de alteração, declarando o parâmetrocorrespondenteByVal (Visual Basic) 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 deixar que o código de chamada determinar o mecanismo para passar argumentos em cada chamada. Ele faz isso colocando o argumento correspondente entre parênteses devem passar por valor ou não envolve em parênteses devem passar por referência. For more information, see Como: forçar um argumento a ser passado por valor (Visual Basic).
Exemplo
The following example shows two procedures that take an array variable and operate on its elements. The increase procedure simply adds one to each element. The replace procedure assigns a new array to the parameter a() and then adds one to each element. No entanto, a reatribuição não afeta a matriz subjacente variável 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 MsgBox chamada exibe "após increase(n): 11, 21, 31, 41". Because the array n is a reference type, replace can change its members, even though the passing mechanism is ByVal.
A segunda MsgBox chamada exibe "depois de 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 proprietário. Quando replace cria a nova instância de matriz k e a atribui à variávellocal a, ele perde a referência a n passado pelo código de chamada. Quando ele se transformar os membros do a, apenas o array local k é afetado. Portanto, replace não incrementa os valores da matriz n no código de chamada.
Compilando o código
The default in Visual Basic is to pass arguments by value. However, it is good programming practice to include either the ByVal (Visual Basic) or ByRef (Visual Basic) keyword with every declared parameter. This makes your code easier to read.
Consulte também
Tarefas
Como: Passar argumentos para um procedimento (Visual Basic)
Como: Alterar o valor de um argumento de procedimento (Visual Basic)
Como: forçar um argumento a ser passado por valor (Visual Basic)
Conceitos
Parâmetros e argumentos de procedimento (Visual Basic)
Passando argumentos por valor e por referência (Visual Basic)
Diferenças entre argumentos modificáveis e não modificáveis (Visual Basic)
Diferenças entre passar um argumento por valor e por referência (Visual Basic)
Passagem de argumentos por posição e nome (Visual Basic)