Когда использовать IEquatable <T> и почему

Что делает IEquatable купите Вас, точно? Единственная причина I видит, что это быть полезным, создавая универсальный тип и вынуждая пользователей реализовать и записать, что польза равняется методу.

Что я пропускаю?

42
задан Palec 3 September 2019 в 13:21
поделиться

2 ответа

Из 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;
}
40
ответ дан 26 November 2019 в 23:39
поделиться

Я довольно часто использую IEquatable, хотя с чисто технической точки зрения это не дает мне особых преимуществ. Переопределение System.Object.Equals может предоставить вам ту же функциональность.

Однако мне нравится явность реализации IEquatable. Я часто использую концепции Entities и Value Objects из Domain-Driven Design, и особенно часто использую IEquatable для Value Objects, просто потому, что он сигнализирует, что тип имеет четко определенное равенство.

10
ответ дан 26 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: