C#: перегрузка операторов

Операторы могут быть перегружены, чтобы обеспечить более естественный синтаксис для пользовательских типов. В большей степени это актуально для реализации пользовательских структур, представляющих довольно простые типы данных.

Перегружены могут быть следующие операторы:

+ - * / ++ -- ! ~ % & | ^ == != < << >> >

а также операторы автоматического и явного приведения (с помощью ключевых слов implicit и explicit), литералы true и false, и унарные + и -.

Составные операторы присвоения (например, +=, /=) автоматически переопределяются при переопределении соответствующих не составных операторов (например, +, /).

Операторные методы (Operator Functions)

Перегрузить оператор можно объявив операторный метод. Операторный метод должен быть статическим, и как минимум один из его операндов должен быть того типа, в котором объявлен операторный метод. Объявляется операторный метод с помощью ключевого слова operator:

В примере описывается структура, представляющая собой музыкальную ноту. С помощью перегруженного оператора + мы можем создать новую ноту:

Поскольку оператор + был перегружен, перегружен был и составной оператор +=:

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

Операторы равенства и сравнения обычно переопределяются для структур, реже для классов. При перегрузке этих операторов необходимо соблюдать несколько правил:

  • Парность операторов: операторы, представляющие логическую пару: (== !=), (< >),
    and (<= >=), перегружаются одновременно (т.е. если перегружен один оператор, второй автоматически считается также перегруженным).
  • Equals и GetHashCode: при перегрузке операторов == и !=, также необходимо переопределить методы Equals и GetHashCode (определены для object), чтобы коллекции и хэштаблицы могли корректно работать с типом.
  • IComparable и IComparable<T>: при перегрузке операторов < и > как правило необходимо реализовывать интерфейсы IComparable и IComparable<T>.

В продолжение примера структуры Note:

Автоматическое и явное преобразование

Автоматическое и явное преобразование могут быть перегружены также как операторы. Перегрузка преобразований типов обычно используется для того, чтоб сделать ее более лаконичной и естественной для связанных типов.

В следующем примере объявляется преобразование между структурой Note (из примера выше) и типом double (представляющим частоту ноты в герцах):

Переопределенные преобразования игнорируются операторами as и is.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *