Como forçar um argumento a ser passado por valor (Visual Basic)
A declaração de procedimento determina o mecanismo para passar argumentos. Se um parâmetro for declarado ByRef, o Visual Basic espera passar o argumento correspondente por referência. Isso permite que o procedimento altere o valor do elemento de programação subjacente ao argumento no código de chamada. Se você quiser proteger o elemento subjacente contra essa alteração, você poderá substituir o mecanismo para passar argumentos ByRef
na chamada de procedimento colocando o nome do argumento em parênteses. Esses parênteses são além dos parênteses que incluem a lista de argumentos na chamada.
O código de chamada não pode substituir um mecanismo ByVal.
Para forçar um argumento a ser passado por valor
Se o parâmetro correspondente for declarado
ByVal
no procedimento, você não precisará executar nenhuma etapa adicional. O Visual Basic já espera passar o argumento por valor.Se o parâmetro correspondente for declarado como
ByRef
no procedimento, coloque o argumento entre parênteses na chamada de procedimento.
Exemplo
O exemplo a seguir substitui uma declaração de parâmetro ByRef
. Na chamada que força ByVal
, observe os dois níveis de parênteses.
Sub setNewString(ByRef inString As String)
inString = "This is a new value for the inString argument."
MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"
' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)
' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)
Quando str
está entre parênteses adicionais na lista de argumentos, o procedimento setNewString
não pode alterar seu valor no código de chamada e MsgBox
exibe "Não pode ser substituído se for passado por ByVal". Quando str
não está entre parênteses adicionais, o procedimento pode alterá-lo e MsgBox
exibe "Este é um novo valor para o argumento inString".
Compilar o código
Ao passar uma variável por referência, você deve usar a palavra-chave ByRef
para especificar esse mecanismo.
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.
Programação robusta
Se um procedimento declarar um parâmetro ByRef, a execução correta do código poderá depender de ser capaz de alterar o elemento subjacente no código de chamada. Se o código de chamada substituir esse mecanismo de chamada colocando o argumento entre parênteses ou se ele passar um argumento não modificável, o procedimento não poderá alterar o elemento subjacente. Isso pode produzir resultados inesperados no código de chamada.
Segurança do .NET Framework
Há sempre um risco potencial em permitir que um procedimento altere o valor subjacente a um argumento no código de chamada. Verifique se você espera que esse valor seja alterado e esteja preparado para verificar sua validade antes de usá-lo.
Confira também
- Procedimentos
- Parâmetros e Argumentos de Procedimento
- Como passar argumentos para um procedimento
- Passar argumentos por valor e por referência
- Diferenças entre argumentos modificáveis e não modificáveis
- Diferenças entre passar um argumento por valor e por referência
- Como alterar o valor de um argumento de procedimento
- Como proteger um argumento de procedimento contra alterações de valor
- Passando argumentos por posição e nome
- Tipos de Valor e Tipos de Referência