共用方式為


運算子多載

備註

此內容經Pearson Education, Inc.授權從架構設計指導方針:可重複使用 .NET 程式庫的慣例、習慣用語與範式 (第2版)轉載。 該版於2008年出版,該書自那以後已於 第三版全面修訂。 此頁面的某些資訊可能已過期。

運算子多載可讓架構類型顯示為內建語言基本類型。

雖然在某些情況下是被允許且有其用途的,但應該謹慎使用運算子過載。 有許多案例中運算子重載被濫用,例如當架構設計者開始使用運算子作為應該是簡單方法的操作時。 下列指導方針應該可協助您決定何時及如何使用運算符多載。

❌ 避免定義運算子多載,但類型應該像基本類型(內建)類型一樣。

✔️ 考慮在類別中定義運算子重載,讓它如同原始類型一樣。

例如, System.String 具有 operator==operator!= 定義。

✔️ DO 會在代表數位的結構中定義運算元多載(例如 System.Decimal)。

❌ 定義運算子多載時請勿使用花俏的技巧。

運算子多載在操作結果一目瞭然的情況下很有用。 例如,能夠從另一個DateTime中減去一個DateTime並取得TimeSpan是合理的。 不過,不適合使用邏輯聯集運算符來聯集兩個資料庫查詢,或使用位移運算符寫入資料流。

❌ 除非至少有一個運算元是定義多載的類型,否則請勿提供運算元多載。

✔️ 以對稱方式多載運算元。

例如,如果您多載 operator==,則也應該多載 operator!=。 同樣地,如果您要多載operator<,那麼您也應該多載operator>,如此類推。

✔️ 請考慮提供對應至每個多載運算子之易記名稱的方法。

許多語言都不支援運算子重載。 基於這個理由,建議多載運算符的類型包含具有適當網域特定名稱的次要方法,以提供對等功能。

下表包含運算子清單和對應的易記方法名稱。

C# 運算子符號 元數據名稱 友善名稱
N/A op_Implicit To<TypeName>/From<TypeName>
N/A op_Explicit To<TypeName>/From<TypeName>
+ (binary) op_Addition Add
- (binary) op_Subtraction Subtract
* (binary) op_Multiply Multiply
/ op_Division Divide
% op_Modulus Mod or Remainder
^ op_ExclusiveOr Xor
& (binary) op_BitwiseAnd BitwiseAnd
| op_BitwiseOr BitwiseOr
&& op_LogicalAnd And
|| op_LogicalOr Or
= op_Assign Assign
<< op_LeftShift LeftShift
>> op_RightShift RightShift
N/A op_SignedRightShift SignedRightShift
N/A op_UnsignedRightShift UnsignedRightShift
== op_Equality Equals
!= op_Inequality Equals
> op_GreaterThan CompareTo
< op_LessThan CompareTo
>= op_GreaterThanOrEqual CompareTo
<= op_LessThanOrEqual CompareTo
*= op_MultiplicationAssignment Multiply
-= op_SubtractionAssignment Subtract
^= op_ExclusiveOrAssignment Xor
<<= op_LeftShiftAssignment LeftShift
%= op_ModulusAssignment Mod
+= op_AdditionAssignment Add
&= op_BitwiseAndAssignment BitwiseAnd
|= op_BitwiseOrAssignment BitwiseOr
, op_Comma Comma
/= op_DivisionAssignment Divide
-- op_Decrement Decrement
++ op_Increment Increment
- (unary) op_UnaryNegation Negate
+ (unary) op_UnaryPlus Plus
~ op_OnesComplement OnesComplement

多載運算子 ==

operator ==重載相當複雜。 運算子的語意必須與數個其他成員相容,例如 Object.Equals

轉換運算子

轉換運算子是一元運算符,允許從某個類型轉換成另一種類型。 運算子必須定義為運算元或傳回型別的靜態成員。 轉換運算子有兩種類型:隱含和明確。

❌ 如果使用者未明確預期這類轉換,請勿提供轉換運算符。

❌ 請勿在類型的定義領域之外定義轉換運算元。

例如, Int32DoubleDecimal 都是數值類型,而 DateTime 不是。 因此,應該沒有轉換運算子可將 Double(long) 轉換成 DateTime。 建構函式在這類情況下是慣用的。

❌ 如果轉換可能遺失,請勿提供隱含轉換運算符。

例如,不應該有從 DoubleInt32 的隱含轉換,因為 Double 的範圍比 Int32 寬。 即使轉換可能導致遺失,也可以提供顯式轉換運算符。

❌ 請勿從隱式轉型拋出例外狀況。

使用者很難瞭解所發生的情況,因為它們可能不知道正在進行轉換。

✔️ System.InvalidCastException 如果轉換運算子的呼叫導致遺失轉換,且運算符的合約不允許遺失轉換,則擲回 DO。

© 2005年、2009年Microsoft公司部分。 保留所有權利。

經 Pearson Education, Inc. 許可重新刊登自 Krzysztof Cwalina 和 Brad Abrams 所著的 架構設計指導方針: 可重複使用的 .NET 程式庫慣例、慣用語和模式,第 2 版,2008 年 10 月 22 日由 Addison-Wesley Professional 發行,作為 Microsoft Windows 開發系列的一部分。

另請參閱