Passando argumentos por valor e por referência (Visual Basic)

Em Visual Basic, você pode passar um argumento para um procedimento por valor ou por referência.Isso é conhecido como o mecanismode passagem, e determina se o procedimento pode modificar o elemento de programação subjacente o argumento o código de chamada.A declaração do procedimento determina o mecanismo de passagem de cada parâmetro especificando a palavra-chave de ByVal (Visual Basic) ou de ByRef (Visual Basic) .

Distinções

Para passar um argumento para um procedimento, esteja ciente das várias com diferentes que interagem entre si:

  • Se o elemento de programação subjacente modificável é ou não modificáveis

  • Se o argumento é próprio modificável ou não modificáveis

  • Se o argumento está sendo passado por valor ou por referência

  • Se o tipo de dados do argumento é um tipo de valor ou tipo de referência

Para obter mais informações, consulte Diferenças entre os argumentos podem ser modificadas e Nonmodifiable (Visual Basic) e Diferenças entre passar um argumento pelo valor e por referência (Visual Basic).

Escolha do mecanismo de passagem

Você deve escolher o mecanismo de passagem cuidadosamente para cada argumento.

  • proteção.Em escolher entre os dois mecanismos de passagem, o critério o mais importante é a exposição de variáveis de chamada a alteração.A vantagem de passar um argumento ByRef é que o procedimento pode retornar um valor para o código de chamada através do argumento.A vantagem de passar um argumento ByVal é que protege uma variável de ser alterado pelo procedimento.

  • desempenho.Embora o mecanismo de passagem pode afetar o desempenho do seu código, a diferença é geralmente insignificanta.Uma exceção a essa ByValé passado tipo de valor.Em esse caso, Visual Basic copia o conteúdo de dados inteiros do argumento.Portanto, para um grande tipo de valor como uma estrutura, pode ser mais eficiente passe ByRef.

    Para tipos de referência, somente o ponteiro para os dados é copiado (quatro bytes em plataformas de 32 bits, oito bytes em plataformas de 64 bits).Portanto, você pode passar argumentos de tipo String ou Object pelo valor sem prejudicar o desempenho.

Determinar o mecanismo de passagem

A declaração de procedimento especifica o mecanismo de passagem de cada parâmetro.O código de chamada não pode substituir um mecanismo de ByVal .

Se um parâmetro é declarado com ByRef, o código de chamada pode forçar o mecanismo a ByVal incluindo o nome do argumento entre parênteses na chamada.Para obter mais informações, consulte Como: forçar um argumento para ser passados por valor (Visual Basic).

O padrão no Visual Basic é passar argumentos por valor.

Quando passar um argumento por valor

  • Se o elemento de código de chamada que é subjacente ao argumento é um elemento não modificável, declare o parâmetro correspondente ByVal (Visual Basic).Nenhum código pode alterar o valor de um elemento não modificável.

  • Se o elemento é subjacente modificável, mas você não deseja que o procedimento para poder alterar seu valor, declare o parâmetro ByVal.Somente o código de chamada pode alterar o valor de um elemento modificável passado por valor.

Quando passar um argumento por referência

  • Se o procedimento possui uma necessidade genuína de modificar o elemento subjacente no código de chamada, declare o parâmetro correspondente ByRef (Visual Basic).

  • Se a execução correta de código depende do procedimento que alterar o elemento subjacente no código de chamada, declare o parâmetro ByRef.Se você a passagem por valor, ou se o código de chamada substitui ByRef que passa pelo mecanismo incluindo o argumento entre parênteses, a chamada de procedimento pode produzir resultados inesperados.

Exemplo

ddck1z30.collapse_all(pt-br,VS.110).gifDescrição

O exemplo a seguir ilustra quando passar argumentos por valor e quando os passa por referência.o procedimento Calculate tem ByVal e um parâmetro de ByRef .Dada a taxa de juros, rate, e um, importe debt, a tarefa de procedimento é calcular um novo valor para debt que é o resultado de aplicar a taxa de juros para o valor original de debt.Porque debt é um parâmetro de ByRef , o novo total é refletido no valor do argumento no código de chamada que corresponde a debt.o parâmetro rate é um parâmetro de ByVal porque Calculate não deve alterar seu valor.

ddck1z30.collapse_all(pt-br,VS.110).gifCódigo

Module Module1

    Sub Main()
        ' Two interest rates are declared, one a constant and one a 
        ' variable.
        Const highRate As Double = 12.5
        Dim lowRate = highRate * 0.6

        Dim initialDebt = 4999.99
        ' Make a copy of the original value of the debt.
        Dim debtWithInterest = initialDebt

        ' Calculate the total debt with the high interest rate applied.
        ' Argument highRate is a constant, which is appropriate for a 
        ' ByVal parameter. Argument debtWithInterest must be a variable
        ' because the procedure will change its value to the calculated
        ' total with interest applied.
        Calculate(highRate, debtWithInterest)
        ' Format the result to represent currency, and display it.
        Dim debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with high interest: " & debtString)

        ' Repeat the process with lowRate. Argument lowRate is not a 
        ' constant, but the ByVal parameter protects it from accidental
        ' or intentional change by the procedure. 

        ' Set debtWithInterest back to the original value.
        debtWithInterest = initialDebt
        Calculate(lowRate, debtWithInterest)
        debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with low interest:  " & debtString)
    End Sub

    ' Parameter rate is a ByVal parameter because the procedure should
    ' not change the value of the corresponding argument in the 
    ' calling code. 

    ' The calculated value of the debt parameter, however, should be
    ' reflected in the value of the corresponding argument in the 
    ' calling code. Therefore, it must be declared ByRef. 
    Sub Calculate(ByVal rate As Double, ByRef debt As Double)
        debt = debt + (debt * rate / 100)
    End Sub

End Module

Consulte também

Tarefas

Como: passar argumentos para um procedimento (Visual Basic)

Como: alterar o valor de um argumento de procedimento (Visual Basic)

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

Como: forçar um argumento para ser passados por valor (Visual Basic)

Conceitos

Procedimentos no Visual Basic

Parâmetros de procedimentos e argumentos (Visual Basic)

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

Tipos de valor e referência