Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Перегрузка операций проверки на тождественность

Перегрузка операций проверки на тождественность

Вы можете помнить из материала главы 3, что System.Object.Equals() можно переопределить, чтобы сравнение типов выполнялось на основе значений (а не ссылок). Если вы переопределите Equals() (и связанный с Equals() метод System.Object.GetHashCode()), то будет очень просто задать перегрузку операций проверки на тождественность (== и !=). Для иллюстрации мы рассмотрим обновленный тип Point.

// Такая 'инкарнация' Point задает также перегрузку операций == и !=.
public struct Point {
 …
 public override bool Equals(object o) {
  if (o is Point) {
   if (((Point)o).x == this.x && ((Point)о). у == this.y) return true;
  }
  return false;
 }
 public override int GetHashCode() { return this.ToString().GetHashCode(); }
 // Здесь позволяется перегрузка операций == и !=.
 public static bool operator==(Point p1, Point p2) { return p1.Equals(p2); }
 public static bool operator!=(Point p1, Point p2) { return!p1.Equals(p2); }
}

Обратите внимание на то, что данная реализация операций == и != просто вызывает переопределенный метод Equals(), который и выполняет основную работу. С учетом этого вы можете теперь использовать свой класс Point так.

// Использование перегруженных операций проверки на тождественность.
static void Main(string[] args) {
 …
 Console.WriteLine("ptOne == ptTwo: {0}", ptOne == ptTwo);
 Console.WriteLine("ptOne != ptTwo: {0}", ptOne != ptTwo);
}

Как видите, здесь два объекта сравниваются с помощью операций == и !=, а не с помощью "менее естественного" вызова Object.Equals(). При использовании перегрузки операций проверки на тождественность для класса имейте в виду, что в C# требуется, чтобы при переопределении операции – обязательно переопределялась и операция != (если вы забудете это сделать, компилятор вам напомнит).

Оглавление книги


Генерация: 4.486. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз