操作符重载允许类型能够被组合并且能够通过操作符(如 "+"、"-"、"=",以及 "!=")来进行比较。通过添加类型的操作符重载,你可以允许开发者把它当成一个内建的简单类型来使用。操作符重载应该只在为类型表示直觉操作的时候才被完成(例如,支持加法操作的一个数值类型的两个实例)。操作符重载不应该被用来为非直觉的操作而提供一个依据造句法的快捷方式。
下列范例说明了 DateTime 类的加法操作签名。
public static DateTime op_Addition( DateTime d, TimeSpan t );
避免定义操作符的重载,除非是在应该与原始(内建的)类型一样工作的类型中。
考虑在应该与原始类型一样工作的类型中定义操作符的重载。
例如,String 就定义了操作符 == 和操作符 !=。
在呈现数字(如 System.Decimal)的结构中定义操作符的重载。
在定义操作符重载的时候不要自作聪明。操作符的重载在直接得出操作结果的情况下是有用的。例如,它有理由从另外一个 System.DateTime 对象中减去一个 System.DateTime 对象从而获得一个 System.TimeSpan 对象。但是,它不适合在使用逻辑联合操作来联合两个数据库查询的时候被使用,或者是在使用位移操作写入数据流的时候。
除非已经为类型定义了至少一个的操作重载,不要提供操作符的重载。
C# 编译器强制了这个指导方针。
以一个均衡的风格来重载操作符。
例如,如果你重载了相等(=)操作符,那么你同样应该重载不等(!=)操作符。类似地,如果你重载了小于(<)操作符,那么你同样应该重载大于(>)操作符。
考虑为每个重载操作符的方法都提供相应的友好名称。
你必须遵循这个指导方针来适应 CLS。下表中包含了操作符号以及与它们相对应的可选方法和操作符名称的列表。
| C# 操作符号 | 可选方法的名称 | 操作符的名称 |
|---|---|---|
| 未被定义 | ToXxx 或 FromXxx |
op_Implicit |
| 未被定义 | ToXxx 或 FromXxx |
op_Explicit |
| +(二进制) | Add |
op_Addition |
| -(二进制) | Subtract |
op_Subtraction |
| *(二进制) | Multiply |
op_Multiply |
| / | Divide |
op_Division |
| % | Mod |
op_Modulus |
| ^ | Xor |
op_ExclusiveOr |
| &(二进制) | BitwiseAnd |
op_BitwiseAnd |
| | | BitwiseOr |
op_BitwiseOr |
| && | And |
op_LogicalAnd |
| || | Or |
op_LogicalOr |
| = | Assign |
op_Assign |
| << | LeftShift |
op_LeftShift |
| >> | RightShift |
op_RightShift |
| 未被定义 | LeftShift |
op_SignedRightShift |
| 未被定义 | RightShift |
op_UnsignedRightShift |
| == | Equals |
op_Equality |
| > | CompareTo |
op_GreaterThan |
| < | CompareTo |
op_LessThan |
| != | Equals |
op_Inequality |
| >= | CompareTo |
op_GreaterThanOrEqual |
| <= | CompareTo |
op_LessThanOrEqual |
| *= | Multiply |
op_MultiplicationAssignment |
| -= | Subtract |
op_SubtractionAssignment |
| ^= | Xor |
op_ExclusiveOrAssignment |
| <<= | LeftShift |
op_LeftShiftAssignment |
| %= | Mod |
op_ModulusAssignment |
| += | Add |
op_AdditionAssignment |
| &= | BitwiseAnd |
op_BitwiseAndAssignment |
| |= | BitwiseOr |
op_BitwiseOrAssignment |
| , | Comma |
op_Comma |
| /= | Divide |
op_DivisionAssignment |
| -- | Decrement |
op_Decrement |
| ++ | Increment |
op_Increment |
| -(一元) | Negate |
op_UnaryNegation |
| +(一元) | Plus |
op_UnaryPlus |
| ~ | OnesComplement |
op_OnesComplement |