Compartilhar via


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 fornece uma referência direta ao elemento de programação subjacente do argumento no código de chamada do código do procedimento. 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âmetro correspondente ByVal (Visual Basic) no procedimento. Se você quiser ser capaz de alterar um determinado argumento em alguns casos, mas não outros, você pode declará-lo ByRef e deixe o código de chamada para determinar o mecanismo de passagem 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. Para mais informações, consulte Como forçar um argumento a ser passado por valor (Visual Basic).

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 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)))

Exibe o primeiro MsgBox chamada " 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.

A segunda MsgBox chamada exibe " Após Replace(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-lhe uma nova matriz. Quando replace cria a nova instância de matriz k e a atribui à variável local 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

O padrão no Visual Basic é passar argumentos por valor. No entanto, é boa prática de programação incluir a palavra-chave ByVal (Visual Basic) ou ByRef (Visual Basic) com cada parâmetro declarado. Isso facilita a leitura seu código.

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

Procedimentos no Visual Basic

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)

Passando argumentos por posição e nome (Visual Basic)

Tipos de valor e referência