Freigeben über


IEquatable<T> Schnittstelle

Definition

Definiert eine generalisierte Methode, die ein Werttyp oder eine Klasse implementiert, um eine typspezifische Methode zum Bestimmen der Gleichheit von Instanzen zu erstellen.

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)

Typparameter

T

Der Typ der zu vergleichenden Objekte.

Abgeleitet

Beispiele

Das folgende Beispiel zeigt die partielle Implementierung einer Person Klasse, die zwei Eigenschaften implementiert IEquatable<T> und verfügt. LastNameNationalId NationalIdwird als eindeutiger Bezeichner betrachtet, daher gibt die Methode zurückTrue, wenn die NationalId Eigenschaft von zwei Person Objekten identisch ist; andernfalls wird sie zurückgegebenFalse.Equals (Beachten Sie, dass im F#-Beispiel keine Werte für Person Instanzen behandelt null werden.)

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

Hinweise

Diese Schnittstelle wird durch Typen implementiert, deren Werte gleichgesetzt werden können (z. B. die numerischen und Zeichenfolgenklassen). Ein Werttyp oder eine Klasse implementiert die Equals Methode, um eine typspezifische Methode zu erstellen, die für die Bestimmung der Gleichheit von Instanzen geeignet ist.

Anmerkung

Die IComparable<T> Schnittstelle definiert die CompareTo Methode, die die Sortierreihenfolge von Instanzen des implementierenden Typs bestimmt. Die IEquatable<T> Schnittstelle definiert die Equals Methode, die die Gleichheit von Instanzen des implementierenden Typs bestimmt.

Die IEquatable<T> Schnittstelle wird von generischen Auflistungsobjekten wie Dictionary<TKey,TValue>, List<T>, und LinkedList<T> beim Testen auf Gleichheit in methoden wie Contains, , IndexOf, LastIndexOfund Remove. Es sollte für jedes Objekt implementiert werden, das in einer generischen Auflistung gespeichert werden kann.

Weitere Informationen zur Implementierung der IEquatable<T> Schnittstelle finden Sie in den IEquatable<T>.Equals Anmerkungen zur Methode.

Hinweise für Ausführende

Ersetzen Sie den Typparameter der IEquatable<T> Schnittstelle durch den Typ, der diese Schnittstelle implementiert.

Wenn Sie die Implementierung implementieren, sollten Sie auch die Implementierungen Equals(Object) der Basisklassen außer Kraft setzen IEquatable<T>und GetHashCode() damit ihr Verhalten mit der Equals(T) der Methode konsistent ist. Wenn Sie außer Kraft setzen Equals(Object), wird ihre außerKraftsetzungsimplementierung auch in Aufrufen der statischen Equals(System.Object, System.Object) Methode für Ihre Klasse aufgerufen. Darüber hinaus sollten Sie die op_Equality Operatoren überladen op_Inequality . Dadurch wird sichergestellt, dass alle Tests auf Gleichheit konsistente Ergebnisse zurückgeben.

Informationen zum Überschreiben Equals(Object)finden Sie unter Equals(Object).

Für einen Werttyp sollten Sie immer implementieren und außer Kraft setzenEquals(Object), um eine bessere Leistung zu erzielenIEquatable<T>. Equals(Object) Box-Werttypen und basiert auf der Reflexion, um zwei Werte für Gleichheit zu vergleichen. Sowohl Ihre Implementierung als Equals(T) auch Ihre Außerkraftsetzung Equals(Object) sollten konsistente Ergebnisse zurückgeben.

Wenn Sie dies implementieren IEquatable<T>, sollten Sie auch implementieren IComparable<T> , ob Instanzen Ihres Typs sortiert oder sortiert werden können. Wenn Ihr Typ implementiert IComparable<T>wird, implementieren IEquatable<T>Sie fast immer auch .

Beachten Sie, dass es einige Designs gibt, bei denen ein Typ eine Bestellbeziehung unterstützt, die Gleichheit kann jedoch von einer Sortierbeziehung abweichen. Betrachten Sie eine Person Klasse, in der Sie alphabetisch sortieren. Zwei Personen mit demselben Namen sortieren die gleichen, sind aber nicht dieselbe Person.

Methoden

Name Beschreibung
Equals(T)

Gibt an, ob das aktuelle Objekt einem anderen Objekt desselben Typs entspricht.

Gilt für:

Weitere Informationen