[#] О сравнении объектов по значению — 3, или Type-specific Equals & Equality operators
habrabot(difrex,1) — All
2016-11-14 01:00:03


Ранее мы [рассмотрели][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