按位置和名称传递自变量 (Visual Basic)

在调用 SubFunction 过程时,可以按位置传递参数(按照参数在过程定义中的显示顺序传递),也可以按名称传递参数(不考虑位置)。

在按名称传递参数时,请指定该参数的声明名称,后接冒号和等号 (:=),再后接参数值。 可按任意顺序提供命名参数。

例如,以下 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)

fathermother 参数的值为 Nothing 时,混合使用命名参数和位置参数有助于使代码意图变得明确:

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

若要在位置参数后面接上命名参数,必须将以下元素添加到 Visual Basic 项目 (*.vbproj) 文件中:

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

有关详细信息,请参阅设置 Visual Basic 语言版本

按名称提供参数的限制

不能出于避免输入必需参数的目的而按名称传递参数。 只能省略可选参数。

不能按名称传递参数数组。 这是因为,在调用过程时,将为参数数组提供不限数量的逗号分隔参数,而编译器无法将多个参数与单个名称相关联。

另请参阅