运算符重载
运算符重载允许使用“+”、“-”、“=”和“!=”等运算符合并和比较类型。 通过在类型中添加运算符重载,开发人员可以像使用内置基元类型一样使用该类型。 只有在运算对类型具有很直观的意义(例如,支持表示数值的类型的两个实例相加)的情况下,才应进行运算符重载。 不应使用运算符重载为非直观运算提供语法快捷方式。
下面的示例演示 DateTime 类的加法运算的签名。
[Visual Basic]
Public Shared Function op_Addition(ByVal d As DateTime, _
ByVal t As TimeSpan _
) As DateTime
[C#]
public static DateTime op_Addition(
DateTime d,
TimeSpan t
);
避免定义运算符重载,但在其用法应类似于基元(内置)类型的类型中除外。
考虑在其用法应类似于基元类型的类型中定义运算符重载。
例如,String 定义运算符 == 和 !=。
在表示数字的结构(如 System.Decimal)中定义运算符重载。
在定义运算符重载时,不要偏离直观意义。 当重载运算符后运算结果非常直观的情况下才适于进行运算符重载。 例如,用一个 System.DateTime 对象减去另一个 System.DateTime 对象得到一个 System.TimeSpan 对象这一操作有直观的意义。 但是,使用逻辑 union 运算符联合两个数据库查询或使用 shift 运算符写入流则不合适。
除非至少有一个操作数属于定义重载的类型,否则不要提供运算符重载。
C# 编译器强制执行这一准则。
以对称方式重载运算符。
例如,如果重载相等运算符,也应重载不等运算符。 同样,如果重载小于运算符,也应重载大于运算符。
考虑为每个重载运算符所对应的方法提供友好的名称。
必须遵守此项准则才能符合 CLS。 下表列出了运算符符号、其相应的替换方法以及运算符名称。
C# 运算符符号 |
替换方法名称 |
运算符名称 |
---|---|---|
未定义 |
ToXxx 或 FromXxx |
op_Implicit |
未定义 |
ToXxx 或 FromXxx |
op_Explicit |
+(二进制) |
添加 |
op_Addition |
-(二进制) |
Subtract |
op_Subtraction |
*(二进制) |
相乘 |
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 |
*= |
相乘 |
op_MultiplicationAssignment |
-= |
Subtract |
op_SubtractionAssignment |
^= |
Xor |
op_ExclusiveOrAssignment |
<<= |
LeftShift |
op_LeftShiftAssignment |
%= |
Mod |
op_ModulusAssignment |
+= |
添加 |
op_AdditionAssignment |
&= |
BitwiseAnd |
op_BitwiseAndAssignment |
|= |
BitwiseOr |
op_BitwiseOrAssignment |
, |
逗号 |
op_Comma |
/= |
Divide |
op_DivisionAssignment |
-- |
递减 |
op_Decrement |
++ |
递增 |
op_Increment |
-(一元) |
Negate |
op_UnaryNegation |
+(一元) |
Plus |
op_UnaryPlus |
~ |
OnesComplement |
op_OnesComplement |
部分版权所有 2005 Microsoft Corporation。 保留所有权利。
部分版权所有 Addison-Wesley Corporation。 保留所有权利。
设计指引的详细信息,请参阅"框架设计准则: 公约、 成语和可重复使用的模式。网络图书馆"书 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 韦斯利,发表。