Partilhar via


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

Procedimentos no Visual Basic

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

Passagem de Argumentos por Posição e Nome

Tipos de valores e tipos de referências