如何:确定是否提供了可选参数
更新:2007 年 11 月
当过程定义可选参数时,可能需要确定调用代码是否已经提供对应的参数或省略此参数。
如果参数值与其默认值相等,则可能是由于以下两种原因之一:
调用代码在过程调用中省略此参数;或者
调用代码提供的参数与参数的默认值完全相等。
过程代码无法区分这两种可能性。通常这样没有什么影响,但有些情况过程可能需要对每种可能性执行不同的操作。最好的方法就是定义与默认值不同的值,尽管这样不能保证调用代码无法提供此值。
如果确定调用程序是否提供可选参数十分重要,则最安全的方法就是定义过程的重载版本。请参见 如何:定义一个过程的多个版本 和 重载过程注意事项。
确定是否已将变量传递给可选参数
定义与参数的默认值完全不同的值。
如果可选参数是像 String 这样的引用类型,则可以使用 Nothing 作为默认值,除非它正好是变量期待的值。
在过程代码中比较此参数和默认值,并执行适当的操作。
重载过程(一个使用可选参数,一个不使用可选参数)
定义带可选参数的过程的另一种方法是使用重载。如果有一个可选参数,可以定义过程的两个重载版本,一个接受此参数,另一个则不接受。此方法会随着可选参数数量的增加而变得更复杂。然而,这样做的优点是可以完全确定调用程序是否提供了每个可选参数。
定义过程的不同版本以涵盖包含参数和省略参数的情形
定义一个带有参数列表的过程版本。请不要将参数声明为 Optional。
定义另一个不带参数的过程版本。声明应该与第一个版本的声明在其他每个方面完全相同。
在各个过程版本中分别放置适当的代码。
示例
下面的过程定义一个可选参数 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) 作为默认值,除非它是变量期待的值。
有关如何使用重载确定是否已传递可选参数的示例,请参见 如何:重载带有可选参数的过程。