Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 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# требуется, чтобы при переопределении операции – обязательно переопределялась и операция != (если вы забудете это сделать, компилятор вам напомнит).
- Создание пользовательских индексаторов
- Внутреннее представление индексаторов типов
- Заключительные замечания об индексаторах
- Перегрузка операций
- Перегрузка бинарных операций
- Перегрузка унарных операций
- Перегрузка операций проверки на тождественность
- Перегрузка операций сравнения
- Внутреннее представление перегруженных операций
- Использование перегруженных операций в языках, не поддерживающих перегрузку операций
- Заключительные замечания о перегрузке операций
- Пользовательские преобразования типов
- Создание пользовательских подпрограмм преобразования
- Определение подпрограмм неявного преобразования
- Внутреннее представление пользовательских подпрограмм преобразования
- Ключевые слова C#, предназначенные для более сложных конструкций
- Директивы препроцессора C#
- Резюме
- Внутреннее представление перегруженных операций
- Перегрузка унарных операций
- Перегрузка операций сравнения
- 4. Свойства унарных операций
- 3. Свойства бинарных операций
- 4. Варианты операций соединения
- Перегрузка методов с несколькими параметрами типа
- Перегрузка конструкторов
- При неудачном выполнении некоторых операций Windows динамик издает пронзительный звук. Можно ли заставить его замолчать?
- 7.2. Операции проверки файлов
- ОО-разработка и перегрузка
- 12.1. Операторы проверки: assert()