Карточка Middle Коллекции и LINQ обновлено
Контракт Equals и GetHashCode
Вопрос
Какие правила нужно соблюдать, переопределяя Equals и GetHashCode?
Попробуйте сами
Ответьте про себя или вслух, потом откройте ответ и сверьтесь.
Показать ответ и разбор
Коротко
- Равные объекты обязаны иметь одинаковый хеш. Обратное не требуется. - Хеш не должен меняться, пока объект лежит в хеш-коллекции: считайте его по неизменяемым полям. - Переопределяете Equals, переопределяйте и GetHashCode (и ==, если нужно). - Удобно: HashCode.Combine(a, b) или record.
Ответ
- Равные объекты обязаны иметь одинаковый хеш. Обратное не требуется.
- Хеш не должен меняться, пока объект лежит в хеш-коллекции: считайте его по неизменяемым полям.
- Переопределяете
Equals, переопределяйте иGetHashCode(и==, если нужно). - Удобно:
HashCode.Combine(a, b)илиrecord.
Разбор
Нарушение первого правила ломает Dictionary и HashSet: равный ключ не находится.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.