在 Visual Basic(无论是 Classic 还是 .NET)中,可以使用关键字 Optional 声明程序和函数的可选参数。对于这些参数,还可以指定默认值。
语法:
Sub SendMessage(message As String, Optional urgent As Boolean = False) If urgent Then Console.WriteLine("URGENT: " & message) Else Console.WriteLine(message) End If End Sub ' 调用: SendMessage("你好!") ' urgent = False SendMessage("重要消息!", True)
重要细节:
Optional参数必须始终位于参数列表的最后。- 如果参数没有默认值,则其值被定义为
Nothing或其类型的默认值(例如整数的默认值为 0)。- 在经典 VB 中,Optional 类型的选择是有限的:不能使用没有默认值的类型(例如,不可空类)。
问题: 在 Visual Basic 中可以在可选参数(Optional)后声明必需参数吗?请解释原因(否/是)并说明如何避免。
答案: 不可以,在声明了至少一个 Optional 参数后,所有后续参数也必须声明为 Optional。这是语法要求,以避免在按位置传递参数时产生混淆。
错误代码示例:
Sub PrintReport(Optional pageSize As String = "A4", copies As Integer) ' 编译错误:必需参数不能出现在可选参数之后 End Sub
解决方案是改变参数的顺序:
Sub PrintReport(copies As Integer, Optional pageSize As String = "A4") ' 正确版本 End Sub
故事
在一个大型项目中,客户给文件共享过程添加了一个可选参数,却忘记了它所需的默认值。之后,在调用该方法时未指定参数,导致
Nothing被处理为文件名,从而引发加载错误。
故事
由于从另一个系统复制方法签名,参数顺序被破坏——必需参数在
Optional之后。程序员通过仅调整顺序修复了编译错误,但在所有调用中没有意识到编号已经偏移。这导致函数在代码中超过 30 个地方发生错误。
故事
为了减少代码量,决定将空字符串指定为字符串参数的默认值。然而在某些情况下,处理空值与处理缺少参数的方式不同,从而导致对话框的逻辑不合理——标准文本未显示,表单无解释地被隐藏。