IEquatable<T> Interfejs
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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. |