Passando argumentos por posição e por nome (Visual Basic)
Quando você chama um Sub
ou Function
procedimento, você pode passar argumentos por posição — na ordem em que aparecem na definição do procedimento — ou você pode passá-los pelo nome, independentemente da posição.
Ao passar um argumento pelo nome, você especifica o nome declarado do argumento seguido por dois pontos e um sinal de igual (:=
), seguido pelo valor do argumento. Você pode fornecer argumentos nomeados em qualquer ordem.
Por exemplo, o procedimento a seguir Sub
usa três argumentos:
Public Class StudentInfo
Shared Sub Display(name As String,
Optional age As Short = 0,
Optional birth As Date = #1/1/2000#)
Console.WriteLine($"Name = {name}; age = {age}; birth date = {birth:d}")
End Sub
End Class
Ao chamar esse procedimento, você pode fornecer os argumentos por posição, por nome ou usando uma mistura de ambos.
Passando argumentos por posição
Você pode chamar o Display
método com seus argumentos passados por posição e delimitados por vírgulas, conforme mostrado no exemplo a seguir:
StudentInfo.Display("Mary", 19, #9/21/1998#)
Se você omitir um argumento opcional em uma lista de argumentos posicionais, deverá manter seu lugar com uma vírgula. O exemplo a seguir chama o Display
método sem o age
argumento:
StudentInfo.Display("Mary",, #9/21/1998#)
Passando argumentos pelo nome
Como alternativa, você pode chamar Display
com os argumentos passados pelo nome, também delimitados por vírgulas, conforme mostrado no exemplo a seguir:
StudentInfo.Display(age:=19, birth:=#9/21/1998#, name:="Mary")
Passar argumentos pelo nome dessa maneira é especialmente útil quando você chama um procedimento que tem mais de um argumento opcional. Se você fornecer argumentos pelo nome, não precisará usar vírgulas consecutivas para indicar argumentos posicionais ausentes. Passar argumentos pelo nome também facilita o controle de quais argumentos você está passando e quais você está omitindo.
Misturando argumentos por posição e por nome
Você pode fornecer argumentos por posição e por nome em uma única chamada de procedimento, conforme mostrado no exemplo a seguir:
StudentInfo.Display("Mary", birth:=#9/21/1998#)
No exemplo anterior, nenhuma vírgula extra é necessária para manter o lugar do argumento omitido age
, uma vez que birth
é passado pelo nome.
Em versões do Visual Basic anteriores à 15.5, quando você fornece argumentos por uma mistura de posição e nome, os argumentos posicionais devem vir todos primeiro. Depois de fornecer um argumento pelo nome, todos os argumentos restantes devem ser passados pelo nome. Por exemplo, a seguinte chamada para o método exibe o Display
erro do compilador BC30241: Argumento nomeado esperado.
StudentInfo.Display("Mary", age:=19, #9/21/1998#)
A partir do Visual Basic 15.5, os argumentos posicionais podem seguir argumentos nomeados se os argumentos posicionais finais estiverem na posição correta. Se compilado em Visual Basic 15.5, a chamada anterior para o Display
método compila com êxito e não gera mais erro do compilador BC30241.
Essa capacidade de misturar e combinar argumentos nomeados e posicionais em qualquer ordem é particularmente útil quando você deseja usar um argumento nomeado para tornar seu código mais legível. Por exemplo, o construtor de classe a seguir Person
requer dois argumentos do tipo Person
, ambos podem ser Nothing
.
Public Sub New(name As String, father As Person, mother As Person, dateOfBirth As Date)
O uso de argumentos mistos father
nomeados e posicionais ajuda a tornar clara a intenção do código quando o valor dos argumentos e mother
é Nothing
:
Dim p = New Person("Mary", father:=Nothing, mother:=Nothing, #9/21/1998#)
Para seguir argumentos posicionais com argumentos nomeados, você deve adicionar o seguinte elemento ao seu arquivo de projeto do Visual Basic (*.vbproj):
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Para obter mais informações, consulte a configuração da versão da linguagem Visual Basic.
Restrições ao fornecimento de argumentos pelo nome
Não é possível passar argumentos pelo nome para evitar inserir os argumentos necessários. Você pode omitir apenas os argumentos opcionais.
Não é possível passar uma matriz de parâmetros pelo nome. Isso ocorre porque quando você chama o procedimento, você fornece um número indefinido de argumentos separados por vírgulas para a matriz de parâmetros, e o compilador não pode associar mais de um argumento a um único nome.