Поделиться через


Перегрузки операторов

Обновлен: Ноябрь 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.

См. также

Другие ресурсы

Правила разработки членов

Руководство по разработке библиотек классов