Переопределение метода Equals на C#

Ниже перечислены постулаты, касающиеся метода object.Equals.

  • Объект не может быть эквивалентен null (если только он не относится к типу, допускающему null).
  • Эквивалентность рефлексивна (объект эквивалентен сам себе).
  • Эквивалентность симметрична (если a.Equals (b), то b.Equals (а)).
  • Эквивалентность транзитивна (если а.Equals (b) и b.Equals (с), то а.Equals (с)).
  • Операции эквивалентности повторяемы и надежны (они не должны генерировать исключения).

Перегрузка операций == и ! =

В дополнение к переопределению метода Equals можно необязательно перегрузить операции == и ! =. Это почти всегда делается для структур, поскольку в противном случае операции == и ! = просто не будут работать для такого типа.

В случае классов возможны два пути:

  • оставить == и ! = в покое — так, что они будут применять ссылочную эквивалентность;
  • перегрузить == и != вместе с Equals.

Первый подход чаще всего применяется в специальных типах — особенно в изменяемых типах. Это гарантирует ожидаемое поведение, заключающееся в том, что операции == и ! = должны обеспечивать ссылочную эквивалентность со ссылочными типами, и позволяет избежать путаницы у потребителей специальных типов. Пример уже приводился ранее:

var sbl = new StringBuilder (“foo”) ;

var sb2 = new StringBuilder (“foo”);

Console.WriteLine (sbl == sb2); // False (ссылочная эквивалентность)

Console.WriteLine (sbl.Equals (sb2)); 11 True (эквивалентность значений)

Второй подход имеет смысл использовать с типами, для которых потребителю никогда не понадобится ссылочная эквивалентность. Такие типы обычно неизменяемы — как классы string и System.Uri — и временами являются хорошими кандидатами на реализацию в виде структур.

Хотя возможна перегрузка операции ! = с приданием ей смысла, отличающегося от ==, на практике это почти никогда не делают за исключением таких случаев, как сравнение с float .NaN.

Рекомендуем к прочтению →  Характеристики твердотельного SSD диска
Понравилась статья? Поделиться с друзьями:
hi-tech новости
Добавить комментарий

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

Adblock
detector