Передача аргументов по позиции и по имени (Visual Basic)

При вызове Sub или Function процедуре можно передать аргументы по позиции — в порядке, в котором они отображаются в определении процедуры, или передать их по имени без учета позиции.

При передаче аргумента по имени указывается объявленное имя аргумента, за которым следует двоеточие и знак равенства (:=), а затем значение аргумента. Именованные аргументы можно указать в любом порядке.

Например, следующая Sub процедура принимает три аргумента:

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

При вызове этой процедуры можно указать аргументы по позиции, по имени или с помощью сочетания обоих.

Передача аргументов по позиции

Метод можно вызвать Display с его аргументами, передаваемыми по позиции и разделителям запятыми, как показано в следующем примере:

StudentInfo.Display("Mary", 19, #9/21/1998#)

Если в списке позиционных аргументов опущен необязательный аргумент, необходимо разместить его место с запятой. В следующем примере метод вызывается Display без аргумента age :

StudentInfo.Display("Mary",, #9/21/1998#)

Передача аргументов по имени

Кроме того, можно вызывать Display аргументы, передаваемые по имени, также разделенные запятыми, как показано в следующем примере:

StudentInfo.Display(age:=19, birth:=#9/21/1998#, name:="Mary")

Передача аргументов по имени особенно полезна при вызове процедуры с несколькими необязательными аргументами. Если вы предоставляете аргументы по имени, вам не нужно использовать последовательные запятые для обозначения отсутствующих позиционных аргументов. Передача аргументов по имени также упрощает отслеживание того, какие аргументы передаются и какие из них вы пропускаете.

Сочетание аргументов по позиции и по имени

Аргументы можно указать как по позиции, так и по имени в одном вызове процедуры, как показано в следующем примере:

StudentInfo.Display("Mary", birth:=#9/21/1998#)

В предыдущем примере дополнительная запятая не требуется для хранения места опущенного age аргумента, так как birth передается по имени.

В версиях Visual Basic до 15.5 при предоставлении аргументов с помощью сочетания позиций и имен позиционные аргументы должны быть первыми. После предоставления аргумента по имени все остальные аргументы должны передаваться по имени. Например, следующий вызов метода отображает ошибку компилятора Display BC30241: ожидаемый именованный аргумент.

StudentInfo.Display("Mary", age:=19, #9/21/1998#)

Начиная с Visual Basic 15.5 позиционные аргументы могут следовать именованным аргументам, если конечные позиционные аргументы находятся в правильной позиции. При компиляции в Visual Basic 15.5 предыдущий вызов Display метода успешно компилируется и больше не создает ошибку компилятора BC30241.

Эта возможность смешивать и сопоставлять именованные и позиционные аргументы в любом порядке особенно полезна, если вы хотите использовать именованный аргумент, чтобы сделать код более читаемым. Например, для следующего Person конструктора класса требуются два аргумента типа Person, оба из которых могут быть Nothing.

Public Sub New(name As String, father As Person, mother As Person, dateOfBirth As Date)

Использование смешанных именованных и позиционных аргументов помогает сделать намерение кода понятным, если значение father аргументов и mother аргументов Nothing:

Dim p = New Person("Mary", father:=Nothing, mother:=Nothing, #9/21/1998#)

Чтобы следовать позиционных аргументам с именованными аргументами, необходимо добавить следующий элемент в файл проекта Visual Basic (*.vbproj):

<PropertyGroup>
  <LangVersion>15.5</LangVersion>
</PropertyGroup>

Дополнительные сведения см. в разделе "Настройка версии языка Visual Basic".

Ограничения на предоставление аргументов по имени

Нельзя передавать аргументы по имени, чтобы избежать ввода обязательных аргументов. Можно опустить только необязательные аргументы.

Невозможно передать массив параметров по имени. Это связано с тем, что при вызове процедуры вы предоставляете неограниченное число аргументов, разделенных запятыми для массива параметров, и компилятор не может связать несколько аргументов с одним именем.

См. также