Перегрузки операторов
Обновлен: Ноябрь 2007
Перегрузки операторов позволяют комбинировать и сравнивать типы с использованием таких операторов, как "+", "-", "=" и "!=". Добавлением перегрузки операторов к типу Вы позволяете разработчику использовать тип, как будто это встроенный примитивный тип. Перегрузка оператора должна быть выполнена только тогда, когда смысл операции интуитивно ясен для типа (например, для поддержки сложения двух экземпляров типа, который представляет числовое значение). Перегрузка оператора не должна использоваться для представления синтаксически укороченных интуитивно неясных операций.
В следующем примере показано описание оператора сложения класса 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. Однако это не подходит для оператора логического объединения двух запросов к базе данных или при использовании оператора shift для записи в поток.
Не предоставляйте перегруженный оператор, если по меньшей мере один из операндов не имеет тип, для которого определяется перегрузка оператора.
Это правило поддерживается в компиляторе 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 |
Охраняется авторским правом Copyright 2005 Microsoft Corporation. Все права защищены.
Охраняется авторским правом Copyright Addison-Wesley Corporation. Все права защищены.
Дополнительные сведения о руководствах по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.