Что делает IEquatable
купите Вас, точно? Единственная причина I видит, что это быть полезным, создавая универсальный тип и вынуждая пользователей реализовать и записать, что польза равняется методу.
Что я пропускаю?
Из MSDN:
Интерфейс
IEquatable(T)
используется общими объектами коллекций, такими какDictionary(TKey, TValue)
,List(T)
, иLinkedList(T)
при проверке на равенство в таких методах, какContains
,IndexOf
,LastIndexOf
иRemove
.
Реализация IEquatable
потребует на один каст меньше для этих классов и в результате будет немного быстрее, чем стандартный метод object.Equals
, который использовался бы в противном случае. В качестве примера посмотрите на разную реализацию этих двух методов:
public bool Equals(T other)
{
if (other == null)
return false;
return (this.Id == other.Id);
}
public override bool Equals(Object obj)
{
if (obj == null)
return false;
T tObj = obj as T; // The extra cast
if (tObj == null)
return false;
else
return this.Id == tObj.Id;
}
Я довольно часто использую IEquatable
, хотя с чисто технической точки зрения это не дает мне особых преимуществ. Переопределение System.Object.Equals
может предоставить вам ту же функциональность.
Однако мне нравится явность реализации IEquatable
. Я часто использую концепции Entities и Value Objects из Domain-Driven Design, и особенно часто использую IEquatable
для Value Objects, просто потому, что он сигнализирует, что тип имеет четко определенное равенство.