Когда необходимо переопределить Equals () в классе .NET? - PullRequest
3 голосов
/ 08 июня 2010

.NET содержит свою собственную функцию сравнения равенства, однако я не совсем понимаю, как она работает.

Если требуемое поведение Equals () и == заключается в проверке того, что каждое поле объекта равно каждому полю другого объекта, необходимо ли переопределять Equals () с помощью метода, который делает это явно?

Ответы [ 2 ]

5 голосов
/ 08 июня 2010

Если вы работаете с классом, то да, это необходимо.

С ссылочными типами (классами) .NET по умолчанию обеспечивает сравнение на равенство, которое сравнивает саму ссылку, а не значения внутрикласс.Переопределение Equals требуется, если требуется сравнение по полям.

Для структур (типов значений) сравнение по умолчанию заключается в сравнении полей по полям.

С документация :

Реализация по умолчанию Equals поддерживает равенство ссылок для ссылочных типов и битовое равенство для типов значений.Равенство ссылок означает, что сравниваемые ссылки на объекты ссылаются на один и тот же объект.Побитовое равенство означает, что сравниваемые объекты имеют одинаковое двоичное представление.

1 голос
/ 08 июня 2010

Вам нужно делать это очень редко.

Поведение по умолчанию для классов заключается в использовании ReferenceEquality: две ссылки равны, только когда они указывают на один и тот же экземпляр.Это хорошее соответствие для бизнес-объектов, они обычно соответствуют 1 объекту в реальном мире, и вам не нужны дубликаты.

Есть исключения, класс String является ярким примером.Равенство на 2 строки будет сравнивать их символ за символом.Но обратите внимание, что желаемое поведение String - это тип значения, и у Strings нет «идентичности».

...