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

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

Distinctions

Ao passar um argumento para um procedimento, lembre-se de várias distinções diferentes que interagem entre si:

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

  • Se o argumento próprio é modificável ou nonmodifiable

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

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

For more information, see Diferenças entre argumentos modificáveis e não modificáveis (Visual Basic) and Diferenças entre passar um argumento por valor e por referência (Visual Basic).

Opção de mecanismo de passagem

Você deve escolher o mecanismo para passar argumentos cuidadosamente para cada argumento.

  • Proteção. Escolher entre os mecanismos de passagem de dois, o critério mais importante é a exposição de chamar variáveis para alterar. A vantagem de passar um argumento ByRef é que o procedimento pode retornar um valor para o código de chamada através desse argumento. A vantagem de passar um argumento ByVal é que ele protege a uma variável que está sendo alterado pelo procedimento.

  • Desempenho. Embora o mecanismo para passar argumentos pode afetar o desempenho do seu código, a diferença é geralmente é insignificante. Uma exceção a isso é um tipo de valor passado ByVal. Nesse caso, Visual Basic copia o conteúdo de dados inteira do argumento. Portanto, para um grande tipo de valor , como uma estrutura, ela pode ser mais eficiente para passá-lo ByRef.

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

Determinação do mecanismo de passagem

Adeclaração de procedimentoEspecifica o mecanismo para passar argumentos para cada parâmetro. O código de chamada não pode substituir um ByVal o mecanismo, mas se um parâmetro é declarada com ByRef, o código de chamada pode forçar o mecanismo de ByVal colocando o nome de argumento entre parênteses na chamada.

The default in Visual Basic is to pass arguments by value. Você pode tornar seu código mais fácil de ler usando o ByVal palavra-chave. É uma boa prática para incluir qualquer um de programação de ByVal ou ByRefapalavra-chave com cada declarado do parâmetro.

Quando Aprovado um argumento por Valor

  • O parâmetrocorrespondente de declarar se o elemento de código chamada subjacente do argumento é um elemento de nonmodifiable,ByVal (Visual Basic). Código deNão pode alterar o valor de um elemento nonmodifiable.

  • 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 Aprovado um argumento por referência

  • Se o procedimento tenha uma necessidade original para alterar o elemento base no código de chamada, o parâmetrocorrespondente de declararByRef (Visual Basic).

  • Se a execução correta do código depende do procedimento alterar o elemento base no código de chamada, declare o parâmetro ByRef. Se você a passar por valor, ou se o código de chamada substitui a ByRef mecanismo para passar argumentos colocando o argumento entre parênteses, a chamada de procedimento pode produzir resultados inesperados.

Example

Description

O exemplo a seguir ilustra quando passar argumentos por valor e passá-los por referência. Procedimento Calculate tem um ByVal e um ByRef parâmetro. Dada a taxa de juros, ratee uma soma de dinheiro, debt, a tarefa do procedimento é calcular um novo valor para debt ou seja, o resultado da aplicação a taxa de juros para o valor original do debt. Porque debt é um ByRef parâmetro, o novo total será refletido no valor do argumento no código de chamada que corresponde a debt. Parâmetro rate é um ByVal parâmetro porque Calculate não deve alterar o valor.

Code

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 um argumento de procedimento contra alterações de valor (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)

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

Outros recursos

Implementação de tipos de dados (Visual Basic)