Эффективный C #: переопределение Object.Equals (), ура или нет? - PullRequest
4 голосов
/ 10 мая 2011

Во втором издании Effective C # (ISBN-13: 978-0321658708) на стр. 37 книга гласит:

Вторая функция, которую вы никогда не переопределите, - это статический объект.Equals ()

Однако на странице 39 книга гласит:

Дело в том, что если ваш тип должен следовать семантике значений (сравнение содержимого) вместо ссылочной семантики (сравнивая идентичность объекта) вы должны написать собственное переопределение экземпляра Object.Equals ()

Кто-то будет так любезен, чтобы объяснить, почему кто-то переопределил

public virtual bool Equals(object right);

а не

public static bool Equals(object left, object right);

Спасибо:)

Ответы [ 4 ]

8 голосов
/ 10 мая 2011

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

2 голосов
/ 10 мая 2011

Первое, что нужно очистить, - вы не можете переопределить статические методы. Реализация

public static bool Equals(object left, object right);

не может быть переопределено. Метод статического равенства предназначен только для того, чтобы не выполнять нулевую проверку. Внутренне он сначала проверяет наличие равных ссылок, а затем - содержимого (метод не статических равных).

В кавычках, которые вы упомянули выше, первая кавычка ссылается на метод статического равенства, в то время как вторая относится к методу нестатического равенства, оба записываются в нотации как Object.Equals (), но обратите внимание, что первая говорит «static Object.Equals ( ) "

1 голос
/ 10 мая 2011

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

1 голос
/ 10 мая 2011

никогда не переопределять статические Object.Equals ()

Вы должны написать собственное переопределение instance Object.Equals ()

Обратите внимание на разницу, статический против экземпляр .Эти предложения не относятся к одному и тому же методу ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...