228
Глава.8 .Методы
Оператор C#
имя специального метода
рекомендуемое CLS-совместимое
имя метода
++
op_Increment
Increment
--
op_Decrement
Decrement
Нет
op_True
IsTrue { get; }
Нет
op_False
IsFalse { get; }
таблица 8.2.
.Бинарные.операторы.и.их.CLS-совместимые.имена.методов
Оператор C#
имя специального метода
рекомендуемое CLS-совместимое
имя метода
+
op_Addition
Add
–
op_Subtraction
Subtract
*
op_Multiply
Multiply
/
op_Division
Divide
%
op_Modulus
Mod
&
op_BitwiseAnd
BitwiseAnd
|
op_BitwiseOr
BitwiseOr
^
op_ExclusiveOr
Xor
<<
op_LeftShift
LeftShift
>>
op_RightShift
RightShift
==
op_Equality
Equals
!=
op_Inequality
Equals
<
op_LessThan
Compare
>
op_GreaterThan
Compare
<=
op_LessThanOrEqual
Compare
>=
op_GreaterThanOrEqual
Compare
В спецификации CLR определены
многие другие операторы, поддающиеся пере-
грузке, но C# их не поддерживает. Они не очень распространены, поэтому я их здесь
не указал. Полный список есть в спецификации ECMA (
www ecma-international org/
publications/standards/Ecma-335 htm
) общеязыковой
инфраструктуры CLI, разделы
10.3.1 (унарные операторы) и 10.3.2 (бинарные операторы).
таблица 8.1
.(
продолжение
)
229
Методы.перегруженных.операторов
ПриМеЧание
Если.изучить.фундаментальные.типы.библиотеки.классов. NET.Framework.(FCL).—.
Int32,.Int64,.UInt32.и.т .д ,.—.можно.заметить,.что.они.не.определяют.методы.пере-
груженных.операторов .Дело.в.том,.что.компиляторы.целенаправленно.ищут.опе-
рации.с.этими.примитивными.типами.и.генерируют.IL-команды,.манипулирующие.
экземплярами.этих.типов .Если.бы.эти.типы.поддерживали.соответствующие.методы,.
а.компиляторы.генерировали.вызывающий.их.код,.то.каждый.такой.вызов.снижал.бы.
быстродействие.во.время.выполнения .Кроме.того,.чтобы.реализовать.ожидаемое.
действие,.такой.метод.в.конечном.итоге.все.равно.исполнял.бы.те.же.инструкции.
языка.IL .Для.вас.это.означает.следующее:.если.язык,.на.котором.вы.пишете,.не.
поддерживает.какой-либо.из.фундаментальных.типов.FCL,.вы.не.сможете.выполнять.
действия.над.экземплярами.этого.типа
Операторы и взаимодействие языков программирования
Перегрузка операторов очень полезна, поскольку
позволяет разработчикам
лаконично выражать свои мысли в компактном коде. Однако не все языки под-
держивают перегрузку операторов; например,
при использовании языка, не под-
держивающего перегрузку, он не будет знать, как
интерпретировать оператор
+
(если только соответствующий тип не является элементарным в этом языке),
и компилятор сгенерирует ошибку. При использовании языков, не поддержи-
вающих перегрузку, язык должен позволять вызывать методы с приставкой
op_
(например,
op_Addition
) напрямую.
Если вы пишете на языке, не поддерживающем
перегрузку оператора
+
путем
определения в типе, ничто не мешает типу предоставить метод
op_Addition
. Логично
ожидать, что в C# можно вызвать этот метод
op_Addition
, указав оператор
+
, но это
не так. Обнаружив оператор
+
, компилятор C# ищет метод
op_Addition
с флагом
метаданных
specialname
,
который информирует компилятор, что
op_Addition
—
это перегруженный операторный метод. А поскольку метод
op_Addition
создан на
языке, не поддерживающем перегрузку, в методе флага
specialname
не будет,
и компилятор C# вернет ошибку. Ясно, что код любого
языка может явно вызывать
метод по имени
op_Addition
, но компиляторы не преобразуют оператор
+
в вызов
этого метода.
Do'stlaringiz bilan baham: