Правила реализации метода 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 года.

См. также

Ссылки

Реализация метода Equals

Object.Equals

Основные понятия

Правила использования

Другие ресурсы

Руководство по разработке библиотек классов