重载过程注意事项 (Visual Basic)

重载过程时,必须为每个重载版本使用不同的签名。 这通常意味着每个版本必须指定不同的参数列表。 有关详细信息,请参阅过程重载中的“不同签名”。

可以使用 Sub 过程重载 Function 过程,反之亦然,但前提是它们具有不同的签名。 两个重载唯一的不同之处在于,一个有返回值,另一个没有。

可以像重载过程一样重载属性,并且其限制相同。 但是,不能使用属性重载过程,反之亦然。

重载版本的替代方法

有时,可以使用重载版本的替代方法,特别是当参数的存在是可选的或其数量可变时。

请记住,并非所有语言都支持可选参数,并且参数数组仅限于 Visual Basic。 如果要编写一个可能从用多种不同语言编写的代码调用的过程,重载版本可以提供最大的灵活性。

重载和可选参数

当调用代码可以选择提供或省略一个或多个参数时,你可以定义多个重载版本或使用可选参数。

何时使用重载版本

可以考虑在以下情况下定义一系列重载版本:

  • 根据调用代码是否提供可选参数,过程代码中的逻辑有很大不同。

  • 过程代码无法可靠地测试调用代码是否提供了可选参数。 例如,如果没有可能的候选默认值,而调用代码又不可能提供的话,就会出现这种情况。

何时使用可选参数

在以下情况下,你可能更想使用一个或多个可选参数:

  • 当调用代码不提供可选参数时,唯一需要做的是将参数设置为默认值。 在这种情况下,如果定义包含一个或多个 Optional 参数的单个版本,过程代码可能会简单些。

有关详细信息,请参阅可选参数

重载和 ParamArray

当调用代码可以传递可变数量的参数时,你可以定义多个重载版本或使用参数数组。

何时使用重载版本

可以考虑在以下情况下定义一系列重载版本:

  • 你知道调用代码向参数数组传递的值绝不会超过一定数量。

  • 根据调用代码传递的值数量,过程代码中的逻辑有很大不同。

  • 调用代码可以传递不同数据类型的值。

何时使用参数数组

在以下情况下,最好使用 ParamArray 参数:

  • 无法预测调用代码可以传递给参数数组的值数量,这个数量可能很大。

  • 过程逻辑有助于循环访问调用代码传递的所有值,并对每个值执行基本相同的操作。

有关详细信息,请参阅参数数组

可选参数的隐式重载

具有 Optional 参数的过程相当于两个重载过程,一个有可选参数,另一个没有。 不能使用与其中任一过程相对应的参数列表来重载此类过程。 以下声明阐释了这一点。

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

对于具有多个可选参数的过程,存在一组隐式重载,其逻辑与前面示例中的逻辑相似。

ParamArray 参数的隐式重载

编译器将具有 ParamArray 参数的过程视为具有无限数目的重载,且各个重载的差异在于调用代码传递给参数数组的内容,如下所示:

  • 当调用代码不为 ParamArray 提供参数时,具有一个重载

  • 当调用代码提供 ParamArray 元素类型的一维数组时,具有一个重载

  • 对于每个正整数,当调用代码为每个 ParamArray 元素类型提供该数量的参数时,具有一个重载

以下声明阐释了这些隐式重载。

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.

不能使用采用一维数组作为参数数组的参数列表来重载此类过程。 但是,可以使用其他隐式重载的签名。 以下声明阐释了这一点。

' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)

将无类型编程作为重载的替代方法

如果要允许调用代码将不同的数据类型传递给参数,另一种方法是无类型编程。 可以使用 Option Strict 语句-optionstrict 编译器选项将类型检查开关设置为 Off。 然后,不需要声明参数的数据类型。 但是,与重载相比,这种方法有以下缺点:

  • 无类型编程生成的执行代码效率较低。

  • 过程必须测试它预期要传递的每种数据类型。

  • 如果调用代码传递过程不支持的数据类型,编译器无法发出错误信号。

另请参阅