Почему Microsoft рекомендует пропустить реализацию оператора равенства для ссылочных типов? - PullRequest
9 голосов
/ 10 ноября 2011

Согласно MSDN : Большинство ссылочных типов не должны перегружать оператор равенства, даже если они переопределяют Equals.Однако, если вы реализуете ссылочный тип, который должен иметь семантику значений, например тип комплексного числа, вы должны переопределить оператор равенства.

Как лучше всего реализовать равно метод и оператор равенства для типичной сущности домена, такой как Customer?

Должен ли он реализовать равен метод для возврата true , если идентичностииз двух сущностей одинаковы?Что если сущность не является неизменной?Что делать, если оба объекта являются новыми и их идентичности имеют пустые значения.А как насчет оператора равенства?

Как JaredPar упомянул здесь Равно фактически измеряет равенство значений, в то время как == будет измерять, являются ли онита же ссылка.

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

С MSDN :

Большинство ссылочных типов не должны перегружать оператор равенства, даже если они переопределяют Equals.Однако, если вы реализуете ссылочный тип, который должен иметь семантику значений, например тип комплексного числа, вы должны переопределить оператор равенства.

Microsoft считает, что == следует использовать только длятипы, подобные значениям, например числовые типы, такие как Complex, BigInt и т. д. Составные типы, такие как Person, не должны переопределять оператор равенства.Это вопрос стиля кода , и Microsoft Merly предлагает вам следовать этому руководству.Я сомневаюсь, что скомпилированный результат будет сильно отличаться.

3 голосов
/ 10 ноября 2011

Обычно я не реализую (= оператор или Equals () для моих классов, например, Customer).

Вы определенно не должны переопределять оператор =, потому что разработчики, использующие ваши классы, ожидают = для сравненияуказатели, а не сами экземпляры, изменение этого поведения приведет только к ошибкам, потому что люди не ожидают, что оно будет работать таким образом.

Если вы хотите включить способ семантического сравнения, это то, что равно () предназначен для, и вы можете переопределить его для реализации проверки на равенство любым способом, который имеет смысл для использования в вашем коде.

...