如何:确定是否提供了可选参数 (Visual Basic)

当过程定义可选参数时,可能需要确定调用代码是否已经提供对应的参数或省略此参数。

如果参数值与其默认值相等,则可能是由于以下两种原因之一:

  • 调用代码在过程调用中省略此参数;或者

  • 调用代码提供的参数与参数的默认值完全相等。

过程代码无法区分这两种可能性。 通常这样没有什么影响,但有些情况过程可能需要对每种可能性执行不同的操作。 最好的方法就是定义与默认值不同的值,尽管这样不能保证调用代码无法提供此值。

如果确定调用程序是否提供可选参数十分重要,则最安全的方法就是定义过程的重载版本。 请参见 如何:定义一个过程的多个版本 (Visual Basic)重载过程注意事项 (Visual Basic)

确定是否已将变量传递给可选参数

  1. 定义与参数的默认值完全不同的值。

  2. 如果可选参数是像 String 这样的引用类型,则可以使用 Nothing 作为默认值,除非它正好是变量期待的值。

  3. 在过程代码中比较此参数和默认值,并执行适当的操作。

重载过程(一个使用可选参数,一个不使用可选参数)

定义带可选参数的过程的另一种方法是使用重载。 如果有一个可选参数,可以定义过程的两个重载版本,一个接受此参数,另一个则不接受。 此方法会随着可选参数数量的增加而变得更复杂。 然而,这样做的优点是可以完全确定调用程序是否提供了每个可选参数。

定义过程的不同版本以涵盖包含参数和省略参数的情形

  1. 定义一个带有参数列表的过程版本。 请不要将参数声明为 Optional。

  2. 定义另一个不带参数的过程版本。 声明应该与第一个版本的声明在其他每个方面完全相同。

  3. 在各个过程版本中分别放置适当的代码。

示例

下面的过程定义一个可选参数 office,并测试其默认值 QJZ,以查看它是否在调用中被省略。

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
    If office = "QJZ" Then
        Debug.WriteLine("office not supplied -- using Headquarters")
        office = "Headquarters"
    End If
    ' Insert code to notify headquarters or specified office.
End Sub

如果调用代码没有在参数列表中为 office 提供值,则 Visual Basic 将提供默认值“QJZ”。

如果可选参数是像 String 这样的引用类型,则可以使用 Nothing (Visual Basic) 作为默认值,除非它是变量期待的值。

有关如何使用重载确定是否已传递可选参数的示例,请参见 如何:重载带有可选参数的过程 (Visual Basic)

请参见

任务

如何:为过程定义可选参数 (Visual Basic)

如何:调用带有可选参数的过程 (Visual Basic)

参考

Optional (Visual Basic)

ParamArray (Visual Basic)

概念

过程参数和变量 (Visual Basic)

通过值和通过引用传递参数 (Visual Basic)

按位置和名称传递参数 (Visual Basic)

可选参数 (Visual Basic)

参数数组 (Visual Basic)

过程重载 (Visual Basic)