Compartilhar via


IEquatable<T> Interface

Definição

Define um método generalizado que um tipo de valor ou classe implementa para criar um método específico de tipo para determinar a igualdade de instâncias.

generic <typename T>
public interface class IEquatable
public interface IEquatable<T>
public interface IEquatable<T> where T : allows ref struct
type IEquatable<'T> = interface
Public Interface IEquatable(Of T)

Parâmetros de tipo

T

O tipo de objetos a serem comparados.

Derivado

Exemplos

O exemplo a seguir mostra a implementação parcial de uma Person classe que implementa IEquatable<T> e tem duas propriedades LastName e NationalId. NationalId é considerado um identificador exclusivo, portanto, o Equals método retorna True se a NationalId propriedade de dois Person objetos for idêntica; caso contrário, retornará False. (Observe que o exemplo F# não manipula null valores para Person instâncias.)

public class Person : IEquatable<Person>
{
    public Person(string lastName, string ssn)
    {
        LastName = lastName;
        NationalId = ssn;
    }

    public string LastName { get; }

    public string NationalId { get; }

    public bool Equals(Person? other) => other is not null && other.NationalId == NationalId;

    public override bool Equals(object? obj) => Equals(obj as Person);

    public override int GetHashCode() => NationalId.GetHashCode();

    public static bool operator ==(Person person1, Person person2)
    {
        if (person1 is null)
        {
            return person2 is null;
        }

        return person1.Equals(person2);
    }

    public static bool operator !=(Person person1, Person person2)
    {
        if (person1 is null)
        {
            return person2 is not null;
        }

        return !person1.Equals(person2);
    }
}
open System

type Person(lastName: string, nationalId: string) =
    member this.LastName = lastName
    member this.NationalId = nationalId

    interface IEquatable<Person> with
        member this.Equals(other: Person) =
            other.NationalId = this.NationalId

    override this.Equals(obj: obj) =
        match obj with
        | :? Person as person -> (this :> IEquatable<Person>).Equals(person)
        | _ -> false

    override this.GetHashCode() =
        this.NationalId.GetHashCode()

    static member (==) (person1: Person, person2: Person) =
        person1.Equals(person2)

    static member (!=) (person1: Person, person2: Person) =
        not (person1.Equals(person2))
Public Class Person
    Implements IEquatable(Of Person)

    Public Sub New(lastName As String, nationalId As String)
        Me.LastName = lastName
        Me.NationalId = nationalId
    End Sub

    Public ReadOnly Property LastName As String
    Public ReadOnly Property NationalId As String

    Public Overloads Function Equals(other As Person) As Boolean Implements IEquatable(Of Person).Equals
        Return other IsNot Nothing AndAlso other.NationalId = Me.NationalId
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean
        Return Equals(TryCast(obj, Person))
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return NationalId.GetHashCode()
    End Function

    Public Shared Operator =(person1 As Person, person2 As Person) As Boolean
        If person1 Is Nothing Then
            Return person2 Is Nothing
        End If
        Return person1.Equals(person2)
    End Operator

    Public Shared Operator <>(person1 As Person, person2 As Person) As Boolean
        If person1 Is Nothing Then
            Return person2 IsNot Nothing
        End If
        Return Not person1.Equals(person2)
    End Operator
End Class

Comentários

Essa interface é implementada por tipos cujos valores podem ser igualados (por exemplo, as classes numéricas e de cadeia de caracteres). Um tipo de valor ou classe implementa o Equals método para criar um método específico de tipo adequado para determinar a igualdade de instâncias.

Nota

A IComparable<T> interface define o CompareTo método, que determina a ordem de classificação de instâncias do tipo de implementação. A IEquatable<T> interface define o Equals método, que determina a igualdade de instâncias do tipo de implementação.

A IEquatable<T> interface é usada por objetos de coleção genéricos, como Dictionary<TKey,TValue>, List<T>e LinkedList<T> ao testar a igualdade em métodos como Contains, IndexOfe LastIndexOfRemove. Ele deve ser implementado para qualquer objeto que possa ser armazenado em uma coleção genérica.

Para obter mais informações sobre como implementar a IEquatable<T> interface, consulte comentários sobre o IEquatable<T>.Equals método.

Notas aos Implementadores

Substitua o parâmetro de tipo da IEquatable<T> interface pelo tipo que está implementando essa interface.

Se você implementar IEquatable<T>, você também deverá substituir as implementações de classe base de Equals(Object) e GetHashCode() para que seu comportamento seja consistente com o Equals(T) do método. Se você substituir Equals(Object), sua implementação substituída também será chamada em chamadas para o método estático Equals(System.Object, System.Object) em sua classe. Além disso, você deve sobrecarregar os operadores e op_Inequality os op_Equality operadores. Isso garante que todos os testes de igualdade retornem resultados consistentes.

Para obter informações sobre substituição Equals(Object), consulte Equals(Object).

Para um tipo de valor, você sempre deve implementar IEquatable<T> e substituir Equals(Object) por um melhor desempenho. Equals(Object) tipos de valor de caixas e depende da reflexão para comparar dois valores de igualdade. A implementação e Equals(T) a substituição devem Equals(Object) retornar resultados consistentes.

Se você implementar IEquatable<T>, também deverá implementar IComparable<T> se instâncias do seu tipo puderem ser ordenadas ou classificadas. Se o tipo for implementado IComparable<T>, você quase sempre implementará IEquatable<T>.

Observe que há alguns designs em que um tipo dá suporte a uma relação de ordem, mas a igualdade pode ser distinta de uma relação de ordenação. Considere uma Person classe em que você classifica em ordem alfabética. Duas pessoas com o mesmo nome classificam o mesmo, mas não são a mesma pessoa.

Métodos

Nome Description
Equals(T)

Indica se o objeto atual é igual a outro objeto do mesmo tipo.

Aplica-se a

Confira também