C# · Intermediário · Inglês · Técnico
IEquatable
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.