Ранее мы [рассмотрели][1] корректную реализацию минимально необходимого набора доработок класса для сравнения объектов класса по значению.
Теперь рассмотрим Type-specific реализацию сравнения объектов по значению, включающую реализацию Generic-интерфейса [IEquatable(Of T)][2] и перегрузку операторов "==" и "!=".
Type-specific сравнение объектов по значению позволяет достичь:
* Более стабильного, масштабируемого и мнемонического (читаемого) кода (последнее за счет перегруженных операторов).
* Более высокой производительности.
Кроме того, реализация Type-specific сравнения по значению необходима по причинам:
* Стандартные Generic-коллекции (List(Ot T), Dictionary(Of TKey, TValue) и др.) рекомендуют наличие реализации IEquatable(Of T) для всех объектов, помещаемых в коллекции.
* Стандартный компаратор [EqualityComparer(Of T).Default][3] использует (по умолчанию — при наличии) реализацию IEquatable(Of T) у операндов.
Реализация одновременно всех способов сравнения сопряжена определенными с трудностями, т.к. для корректной работы требуется обеспечить:
* Соответствие результатов сравнения у различных способов.
* Сохранение поведения при наследовании.
* Минимизацию copy-paste и общего объема кода.
* Учет того, что операторы сравнения технически являются статическими методами и, соответственно, у них отсутствует полиморфность (а также, что не все [CLS][4]-совместимые языки поддерживают операторы или их перегрузку).
Рассмотрим реализацию сравнения объектов по значению с учетом вышеизложенных условий, на примере класса Person.
Сразу приведем окончательный вариант кода с пояснениями, почему это сделано именно так, и как именно это работает.
(Демонстрация вывода решения с учетом каждого нюанса содержит слишком много итераций.)
[Читать дальше →][5]
[1]:
https://habrahabr.ru/post/314500/
[2]:
https://msdn.microsoft.com/library/ms131187.aspx
[3]:
https://msdn.microsoft.com/library/ms224763.aspx
[4]:
https://msdn.microsoft.com/library/12a7a7h3.aspx
[5]:
https://habrahabr.ru/post/315168/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut