Diferenças entre passar um argumento por valor e por referência (Visual Basic)
Quando você passa um ou mais argumentos para um procedimento, cada argumento corresponde a um elemento de programação subjacente no código de chamada. Você pode passar o valor desse elemento subjacente ou uma referência a ele. Isto é conhecido como o mecanismo de passagem.
Passando por Valor
Você passa um argumento por valor especificando a palavra-chave ByVal para o parâmetro correspondente na definição de procedimento. Quando você usa esse mecanismo de passagem, o Visual Basic copia o valor do elemento de programação subjacente em uma variável local no procedimento. O código de procedimento não tem qualquer acesso ao elemento subjacente no código de chamada.
Passando por Referência
Você passa um argumento por referência especificando a palavra-chave ByRef para o parâmetro correspondente na definição de procedimento. Quando você usa esse mecanismo de passagem, o Visual Basic fornece ao procedimento uma referência direta ao elemento de programação subjacente no código de chamada.
Mecanismo de passagem e tipo de elemento
A escolha do mecanismo de passagem não é a mesma que a classificação do tipo de elemento subjacente. Passar por valor ou por referência refere-se ao que o Visual Basic fornece para o código de procedimento. Um tipo de valor ou tipo de referência refere-se a como um elemento de programação é armazenado na memória.
No entanto, o mecanismo de passagem e o tipo de elemento estão inter-relacionados. O valor de um tipo de referência é um ponteiro para os dados em outro lugar na memória. Isso significa que, quando você passa um tipo de referência por valor, o código do procedimento tem um ponteiro para os dados do elemento subjacente, mesmo que ele não possa acessar o próprio elemento subjacente. Por exemplo, se o elemento for uma variável de matriz, o código de procedimento não terá acesso à variável em si, mas poderá acessar os membros da matriz.
Capacidade de modificar
Quando você passa um elemento não modificável como um argumento, o procedimento nunca pode modificá-lo no código de chamada, seja ele passado ByVal
ou ByRef
.
Para um elemento modificável, a tabela a seguir resume a interação entre o tipo de elemento e o mecanismo de passagem.
Tipo de elemento | Aprovado ByVal |
Aprovado ByRef |
---|---|---|
Tipo de valor (contém apenas um valor) | O procedimento não pode alterar a variável ou qualquer um dos seus membros. | O procedimento pode alterar a variável e seus membros. |
Tipo de referência (contém um ponteiro para uma instância de classe ou estrutura) | O procedimento não pode alterar a variável, mas pode alterar membros da instância para a qual ela aponta. | O procedimento pode alterar a variável e os membros da instância para a qual aponta. |
Consulte também
- Procedimentos
- Parâmetros e argumentos do procedimento
- Como: Passar argumentos para um procedimento
- Passando argumentos por valor e por referência
- Diferenças entre argumentos modificáveis e não modificáveis
- Como alterar o valor de um argumento de procedimento
- Como: Proteger um argumento de procedimento contra alterações de valor
- Como: Forçar um argumento a ser passado por valor
- Passando argumentos por posição e por nome
- Tipos de valor e tipos de referência