Compartilhar via


Como proteger um argumento de procedimento contra alterações de valor (Visual Basic)

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ções declarando o parâmetro correspondente ByVal no procedimento. Se você quiser poder alterar um determinado argumento em alguns casos, mas não em outros, poderá declará-lo ByRef e permitir que o código de chamada determine o mecanismo para passar argumentos em cada chamada. Ele faz isso colocando o argumento correspondente entre parênteses para passá-lo por valor ou sem parênteses para passá-lo por referência. Para mais informações, confira 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 procedimento increase simplesmente adiciona um a cada elemento. O procedimento replace atribui uma nova matriz ao parâmetro a() e adiciona um 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 para passar argumentos 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 ele. Quando replace cria a nova instância de matriz k e a atribui à variável local a, ele perde a referência a n passada pelo código de chamada. Quando ele altera os membros de a, apenas a matriz local k é 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 seu código.

Confira também