ExpertiDict

C# · Intermediário · Inglês · Técnico

IEquatable

/ˌaɪ ɪˈkwɑtəbəl/substantivo

Interface IEquatable<T> declara Equals(T) tipado, evitando boxing em structs e comparações com cast. Deve vir acompanhada de Equals(object) e GetHashCode coerentes.

Onde usar

Aparece ao definir uma struct usada como chave de Dictionary ou HashSet. A comparação padrão de struct pode ser lenta e o GetHashCode padrão é fraco, então implementar IEquatable e um hash correto evita bugs e custo.

Em código

readonly struct Id(int v) : IEquatable<Id>
{
  public int V { get; } = v;
  public bool Equals(Id o) => V == o.V;
  public override bool Equals(object? o)
    => o is Id i && Equals(i);
  public override int GetHashCode() => V;
}

Exemplos

Implement IEquatable so the struct doesn't box.

Implemente IEquatable para a struct não fazer boxing.

Override GetHashCode when you override Equals.

Sobrescreva o GetHashCode quando sobrescrever o Equals.

Cuidado

Não sobrescreva Equals sem GetHashCode: objetos iguais precisam ter o mesmo hash, ou as coleções hash deixam de achá-los.

Veja também

Todos os termos de C#