按位置和名称传递参数 (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#)

如果在位置参数列表中省略可选参数,则必须用逗号保留其位置。 以下示例在没有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)

使用混合命名参数和位置参数时,有助于在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 语言版本

按名称提供参数的限制

不能按名称传递参数,以避免输入所需的参数。 只能省略可选参数。

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

另请参阅