按位置和名称传递自变量 (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#)
如果在位置参数列表中省略某个可选参数,则必须使用逗号保留该参数的位置。 以下示例调用不带 age
参数的 Display
方法:
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 语言版本。
按名称提供参数的限制
不能出于避免输入必需参数的目的而按名称传递参数。 只能省略可选参数。
不能按名称传递参数数组。 这是因为,在调用过程时,将为参数数组提供不限数量的逗号分隔参数,而编译器无法将多个参数与单个名称相关联。