Правила реализации метода Equals и оператора равенства (==)
При реализации метода Equals и оператора равенства (==) следует руководствоваться следующими правилами.
При реализации метода Equals всегда реализуйте метод GetHashCode. При этом сохраняется синхронизация методов Equals и GetHashCode.
Всегда переопределяйте метод Equals при реализации оператора равенства (==). При этом необходимо, чтобы и оператор, и метод выполняли одну функцию. Это позволит коду инфраструктуры, такому как Hashtable и ArrayList, использующему метод Equals, работать таким же образом, как пользовательский код, написанный с использованием оператора равенства.
Переопределяйте метод Equals каждый раз при реализации IComparable.
При реализации интерфейса IComparable рекомендуется реализовать перегрузку оператора для операторов "равенство" (==), "неравенство" (!=), "меньше чем" (<) и "больше чем" (>).
Не вызывайте исключения из методов Equals и GetHashCode или оператора равенства (==).
Сведения о методе Equals см. в разделе Реализация метода Equals.
Реализация оператора равенства (==) в типах значений
В большинстве языков программирования для типов значений не существует реализации оператора равенства (==) по умолчанию. По этой причине следует выполнять перегрузку оператора равенства (==) каждый раз, когда равенство является значимым.
Рекомендуется реализовать метод Equals для типов значений, поскольку реализация по умолчанию в классе System.ValueType не будет выполняться, так же как и пользовательская реализация.
Реализуйте оператор равенства (==) каждый раз, когда переопределяется метод Equals.
Реализация оператора равенства (==) в ссылочных типах
В большинстве языков программирования для ссылочных типов не существует реализации оператора равенства (==) по умолчанию. Поэтому реализацию оператора равенства (==) в ссылочных типах следует использовать очень осторожно. Большинство ссылочных типов, даже те, которые реализуют метод Equals, не должны переопределять оператор равенства (==).
Переопределяйте оператор равенства (==), если тип является базовым, таким как Point, String, BigNumber и т. п. При любой перегрузке операторов сложения (+) и вычитания (-) следует рассмотреть и возможность перегрузки оператора равенства (==).
Фрагменты — © Корпорация Майкрософт (Microsoft Corp.), 2005. Все права защищены.
Фрагменты — © Addison-Wesley Corporation. Все права защищены.
Для дополнительной информации о разработке руководящих принципов, смотрите "руководства по разработке рамок: Конвенций, идиомы и шаблоны для повторного использования.NET библиотек"книга, Кшиштоф Cwalina и Брэд Абрамс, опубликованных Addison-Wesley, 2005 года.