Udostępnij za pośrednictwem


IEquatable<T> Interfejs

Definicja

Definiuje uogólnioną metodę implementowaną przez typ wartości lub klasę w celu utworzenia metody specyficznej dla typu w celu określenia równości wystąpień.

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)

Parametry typu

T

Typ obiektów do porównania.

Pochodne

Przykłady

W poniższym przykładzie przedstawiono częściową implementację Person klasy, która implementuje IEquatable<T> i ma dwie właściwości oraz NationalIdLastName . NationalId jest uważany za unikatowy identyfikator, dlatego Equals metoda zwraca True , jeśli NationalId właściwość dwóch Person obiektów jest taka sama; w przeciwnym razie zwraca wartość False. (Zwróć uwagę, że przykład języka F# nie obsługuje null wartości dla Person wystąpień).

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

Uwagi

Ten interfejs jest implementowany przez typy, których wartości mogą być utożsamiane (na przykład klasy liczbowe i ciągowe). Typ wartości lub klasa implementuje Equals metodę, aby utworzyć metodę specyficzną dla typu odpowiednią do określania równości wystąpień.

Nuta

Interfejs IComparable<T> definiuje metodę CompareTo , która określa kolejność sortowania wystąpień typu implementowania. Interfejs IEquatable<T> definiuje metodę Equals , która określa równość wystąpień typu implementowania.

Interfejs IEquatable<T> jest używany przez ogólne obiekty kolekcji, takie jak , List<T>, i LinkedList<T> podczas testowania pod kątem równości w takich metodach jak Dictionary<TKey,TValue>Contains, , IndexOfLastIndexOfi Remove. Należy go zaimplementować dla dowolnego obiektu, który może być przechowywany w kolekcji ogólnej.

Aby uzyskać więcej informacji na temat implementowania interfejsu IEquatable<T> , zobacz uwagi dotyczące IEquatable<T>.Equals metody .

Notatki dotyczące implementowania

Zastąp parametr IEquatable<T> type interfejsu typem implementujący ten interfejs.

W przypadku zaimplementowania IEquatable<T>metody należy również zastąpić implementacje klas bazowych Equals(Object) i GetHashCode() tak, aby ich zachowanie było zgodne z Equals(T) tą metodą. Jeśli zastąpisz Equals(Object)metodę , implementacja zastąpienia jest również wywoływana w wywołaniach metody statycznej Equals(System.Object, System.Object) w klasie. Ponadto należy przeciążyć op_Equality operatory i op_Inequality . Gwarantuje to, że wszystkie testy równości zwracają spójne wyniki.

Aby uzyskać informacje na temat zastępowania Equals(Object), zobacz Equals(Object).

W przypadku typu wartości należy zawsze implementować IEquatable<T> i zastępować Equals(Object) w celu uzyskania lepszej wydajności. Equals(Object) pola typy wartości i opiera się na odbiciu w celu porównania dwóch wartości równości. Zarówno implementacja, Equals(T) jak i zastąpienie polecenia Equals(Object) powinny zwracać spójne wyniki.

Jeśli zaimplementujesz IEquatable<T>usługę , należy również zaimplementować IComparable<T> , czy wystąpienia typu mogą być uporządkowane lub sortowane. Jeśli typ implementuje IComparable<T>wartość , prawie zawsze implementujesz również funkcję IEquatable<T>.

Należy pamiętać, że istnieją pewne projekty, w których typ obsługuje relację kolejności, ale równość może być różna od relacji porządkowania. Rozważ klasę, w Person której sortujesz alfabetycznie. Dwie osoby o tej samej nazwie posortują to samo, ale nie są tą samą osobą.

Metody

Nazwa Opis
Equals(T)

Wskazuje, czy bieżący obiekt jest równy innemu obiektowi tego samego typu.

Dotyczy

Zobacz też