运算符过程 (Visual Basic)

运算符过程是一系列 Visual Basic 语句,它们定义标准运算符(例如 *<>And)对你定义的类或结构的行为。 此过程也称为运算符重载。

何时定义运算符过程

定义某个类或结构后,可将变量声明为采用该类或结构的类型。 有时,此类变量需要参与作为表达式的一部分的运算。 为此,该变量必须是运算符的操作数。

Visual Basic 仅对其基本数据类型定义运算符。 如果一个或两个操作数采用类或结构的类型,则你可以定义运算符的行为。

有关详细信息,请参阅 Operator 语句

运算符过程的类型

运算符过程可以采用以下类型之一:

  • 一元运算符的定义,其中的参数采用类或结构的类型。

  • 二元运算符的定义,其中至少有一个参数采用类或结构的类型。

  • 转换运算符的定义,其中的参数采用类或结构的类型。

  • 返回类或结构类型的转换运算符的定义。

转换运算符始终是一元的;你始终需要使用 CType 作为要定义的运算符。

声明语法

声明运算符过程的语法如下:

Public Shared [Widening | Narrowing] Operator operatorsymbol ( operand1 [,  operand2 ]) As datatype

' Statements of the operator procedure.

End Operator

仅对类型转换运算符使用 WideningNarrowing 关键字。 对于类型转换运算符,运算符符号始终为 CType 函数

可以声明两个操作数来定义一个二元运算符,并可以声明一个操作数来定义一个一元运算符,包括类型转换运算符。 所有操作数必须声明为 ByVal

声明每个操作数的方式与声明 Sub 过程的参数相同。

数据类型

由于要对已定义的类或结构定义运算符,因此必须至少有一个操作数采用该类或结构的数据类型。 对于类型转换运算符,操作数或返回类型必须采用该类或结构的数据类型。

有关更多详细信息,请参阅 Operator 语句

调用语法

可以通过在表达式中使用运算符符号来隐式调用运算符过程。 提供操作数的方式与为预定义的运算符提供操作数相同。

隐式调用运算符过程的语法如下:

Dim testStruct As structurename

Dim testNewStruct As structurename = testStruct operatorsymbol 10

声明和调用的演示

以下结构存储一个带符号的 128 位整数值作为高位和低位组成部分。 它定义了 + 运算符,以添加两个 veryLong 值并生成最终的 veryLong 值。

Public Structure veryLong
    Dim highOrder As Long
    Dim lowOrder As Long
    Public Shared Operator +(ByVal v As veryLong, 
                             ByVal w As veryLong) As veryLong
        Dim sum As New veryLong
        sum = v
        Try
            sum.lowOrder += w.lowOrder
        Catch ex As System.OverflowException
            sum.lowOrder -= (Long.MaxValue - w.lowOrder + 1)
            sum.highOrder += 1
        End Try
        sum.highOrder += w.highOrder
        Return sum
    End Operator
End Structure

以下示例演示了对 veryLong 中定义的 + 运算符的典型调用。

Dim v1, v2, v3 As veryLong
v1.highOrder = 1
v1.lowOrder = Long.MaxValue
v2.highOrder = 0
v2.lowOrder = 4
v3 = v1 + v2

请参阅