如何:确定是否提供了可选参数

更新:2007 年 11 月

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

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

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

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

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

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

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

  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) 作为默认值,除非它是变量期待的值。

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

请参见

任务

如何:为过程定义可选参数

如何:调用带有可选参数的过程

概念

过程参数和变量

通过值和通过引用传递参数

通过位置和通过名称的参数传递

可选参数

参数数组

过程重载

参考

Optional (Visual Basic)

ParamArray