调用某个 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
参数的位置。
在 15.5 之前的 Visual Basic 版本中,如果通过位置和名称混合提供参数,则位置参数必须首先提供。 按名称提供参数后,所有剩余参数都必须按名称传递。 例如,下面对 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 语言版本。
按名称提供参数的限制
不能按名称传递参数,以避免输入所需的参数。 只能省略可选参数。
不能按名称传递参数数组。 这是因为在调用该过程时,将为参数数组提供无限数量的逗号分隔参数,并且编译器不能将多个参数与单个名称相关联。