Переопределение GetHashCode и Equals в классе, потому что он используется в словаре

Меня попросили переопределить GetHashCode и Equals для определенного класса, потому что я использую экземпляры этого класса в качестве ключа (поиска) в словаре.

Я заметил, что сам класс не содержит никаких общедоступных свойств, а частные поля являются ссылочными типами. В основном публичные методы и события.

Мне все еще нужно переопределить эти методы? Пока что во время тестирования проблем не обнаружил. Как в этом сценарии проверяется равенство? Если я ничего не сделаю, все ли в порядке?

Заранее спасибо.


person Bobbo    schedule 17.05.2014    source источник
comment
Интуитивно это не имеет для меня особого смысла. Почему вы используете класс в качестве ключа, если у него нет уникальных идентифицирующих характеристик?   -  person Cody Gray    schedule 17.05.2014
comment
Почему у вас есть такой тип класса, как ключ словаря? Для меня это просто не имеет смысла.   -  person SoftwareFactor    schedule 17.05.2014
comment
Класс без состояния не следует использовать в качестве ключа словаря, потому что в этом случае ссылочное равенство - это все, что у вас есть. Другими словами, невозможно создать другой объект, который соответствовал бы любому другому объекту этого класса. Еще одно замечание: классы без полей должны быть статическими.   -  person Sergey Kalinichenko    schedule 17.05.2014
comment
Другие комментаторы: этот класс может быть классом перечисления с частным конструктором. И вопреки тому, что вы говорите, это имеет смысл, и это хороший ключ к словарю. С другой стороны, меня беспокоит фраза «Этот класс» в основном обертывает пару объектов. Значит, они не хранятся в полях? Или OP думает, что автоматические свойства не имеют полей поддержки?   -  person Kris Vandermotten    schedule 17.05.2014
comment
the class itself does not contain any fields or properties и This class basically wraps a couple of objects, which also don't contain any fields Оба утверждения противоречат друг другу.   -  person Sriram Sakthivel    schedule 17.05.2014
comment
@dasblinkenlight: классы без полей должны быть статическими - это предложение подходит не для всех случаев. Нет простого способа обеспечить внедрение зависимостей для статических классов, но это часто необходимо. Кроме того, службы без сохранения состояния в WCF реализованы в нестатических классах без состояния ... и могут быть другие причины   -  person Dennis    schedule 17.05.2014
comment
@Dennis Что вы собираетесь делать с инъекцией зависимостей без полей?   -  person Sriram Sakthivel    schedule 17.05.2014
comment
@SriramSakthivel: предположим, у меня есть класс обслуживания, который содержит бизнес-логику, а не состояние. Если этот класс не является статическим, я могу легко внедрить его (или его фиктивную реализацию для целей тестирования). Со статическим классом это невозможно.   -  person Dennis    schedule 17.05.2014
comment
@Dennis Ну, ты прав. если он не предназначен для DI, то это часто является признаком того, что класс без полей может стать статическим.   -  person Sriram Sakthivel    schedule 17.05.2014
comment
К чему все эти разговоры о статичности класса? OP уже заявил об использовании экземпляров этого класса в качестве ключа (поиска) в словаре. Итак, существует уже несколько экземпляров, и этот экземпляр является ключом словаря. Это распространенный шаблон (например, для прикрепления внешних данных к классу, который вы не контролируете).   -  person Joe White    schedule 17.05.2014
comment
Приношу свои извинения, я не очень понял, класс действительно обертывает 2 других объекта, и они хранятся и являются частными полями только для чтения.   -  person Bobbo    schedule 17.05.2014


Ответы (2)


Затем вы можете использовать хэш двух частных объектов в качестве хеша.

hash1 ^ hash2;

И вы можете сравнить значения полей только для чтения на предмет равенства.

Идея в том, что два одинаковых объекта должны быть равны.

person paparazzo    schedule 17.05.2014

Если вы хотите, чтобы каждый экземпляр был уникальным ключом словаря, вам вообще не нужно переопределять Equals и GetHashCode. По умолчанию каждый экземпляр будет уникальным хеш-ключом.

person Joe White    schedule 17.05.2014