運算子程序
更新:2007 年 11 月
運算子程序是一連串的 Visual Basic 陳述式,用來在已定義之類別或結構上定義標準運算子 (例如,*、<> 或 And) 的行為。這也稱為「運算子多載」(Operator Overloading)。
定義運算子程序的時機
已定義類別或結構時,可將變數宣告成該類別或結構的型別。有時,這類變數需要參與運算式的運算。若要這樣做,則它必須是運算子的運算元。
Visual Basic 只可將運算子定義成它的主要資料型別。當其中一個或兩個運算元的型別是類別或結構的型別時,即可定義運算子的行為。
如需詳細資訊,請參閱 Operator 陳述式。
運算子程序的型別
運算子程序可以是下列其中一個型別:
一元 (Unary) 運算子的定義,其中引數的型別就是類別或結構的型別。
二元 (Binary) 運算子的定義,其中至少要有一個引數的型別是類別或結構的型別。
轉換運算子的定義,其中引數的型別就是類別或結構的型別。
轉換運算子的定義,傳回類別或結構的型別。
轉換運算子一律為一元,且一律使用 CType 當成所定義的運算子。
宣告語法
宣告運算子程序的語法如下:
Public Shared [Widening | Narrowing] Operatoroperatorsymbol (operand1 [, operand2]) As datatype
' Statements of the operator procedure.
End Operator
Widening 或 Narrowing 關鍵字只可用於型別轉換運算子上。運算子符號一律是型別轉換運算子的 CType 函式。
宣告兩個運算元以定義二元運算子,且宣告一個運算元以定義一元運算子 (包含型別轉換運算子)。必須宣告所有運算元 ByVal。
每個運算元的宣告方式都與宣告 Sub 程序之參數的方式相同。
資料型別
因為是在已定義的類別或結構上定義運算子,所以至少必須有一個運算元的型別是該類別或結構的型別。若為型別轉換運算子,則運算元或傳回型別的型別必須是類別或結構的資料型別。
如需詳細資訊,請參閱 Operator 陳述式。
呼叫語法
在運算式中使用運算子符號,即可隱含叫用 (Invoke) 運算子程序。提供運算元的方式與提供預先定義之運算子的方式相同。
運算子程序的隱含呼叫語法如下:
Dim testStruct As structurename
Dim testNewStruct As structurename = testStruct operatorsymbol 10
宣告和呼叫的說明
下列結構會將帶有正負號的 128 位元整數值儲存成構成高序位 (High Order) 和低序位 (Low Order) 部分。它會定義 + 運算子以相加兩個 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
如需詳細資訊和範例,請參閱 Visual Basic 2005 中的運算子多載 (英文)。