运算符过程 (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
仅对类型转换运算符使用 Widening
或 Narrowing
关键字。 对于类型转换运算符,运算符符号始终为 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