備註
此內容經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。
轉換運算子
轉換運算子是一元運算符,允許從某個類型轉換成另一種類型。 運算子必須定義為運算元或傳回型別的靜態成員。 轉換運算子有兩種類型:隱含和明確。
❌ 如果使用者未明確預期這類轉換,請勿提供轉換運算符。
❌ 請勿在類型的定義領域之外定義轉換運算元。
例如, Int32、 Double和 Decimal 都是數值類型,而 DateTime 不是。 因此,應該沒有轉換運算子可將 Double(long) 轉換成 DateTime。 建構函式在這類情況下是慣用的。
❌ 如果轉換可能遺失,請勿提供隱含轉換運算符。
例如,不應該有從 Double 到 Int32 的隱含轉換,因為 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 開發系列的一部分。