IEquatable<T> Interfész
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Meghatároz egy általánosított metódust, amelyet egy értéktípus vagy osztály implementál a példányok egyenlőségének meghatározására szolgáló típusspecifikus metódus létrehozásához.
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)
Típusparaméterek
- T
Az összehasonlítandó objektumok típusa.
- Származtatott
Példák
Az alábbi példa egy Person olyan osztály részleges implementálását mutatja be, amely IEquatable<T> két tulajdonsággal rendelkezik, LastName és NationalIda .
NationalIdegyedi azonosítónak minősül, ezért a Equals metódus akkor ad vissza, True ha NationalId két Person objektum tulajdonsága megegyezik, ellenkező esetben pedig .False
(Vegye figyelembe, hogy az F# példa nem kezeli null a példányok értékeit Person .)
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
Megjegyzések
Ezt az interfészt olyan típusok implementálják, amelyek értékei egyenlők lehetnek (például numerikus és sztringosztályok). Az értéktípus vagy -osztály egy olyan típusspecifikus metódus létrehozására implementálja a Equals metódust, amely alkalmas a példányok egyenlőségének meghatározására.
Note
Az IComparable<T> interfész határozza meg a CompareTo metódust, amely meghatározza a implementálási típus példányainak rendezési sorrendjét. Az IEquatable<T> interfész határozza meg a Equals metódust, amely meghatározza a implementálási típus példányainak egyenlőségét.
Az IEquatable<T> interfészt olyan általános gyűjteményobjektumok használják, mint Dictionary<TKey,TValue>például a , List<T>, és LinkedList<T> amikor az egyenlőséget tesztelik olyan metódusokban, mint a Contains, IndexOf, LastIndexOfés Remove. Minden olyan objektumhoz implementálandó, amely egy általános gyűjteményben tárolható.
A felület implementálásával IEquatable<T> kapcsolatos további információkért lásd a IEquatable<T>.Equals metódussal kapcsolatos megjegyzéseket.
Megjegyzések az implementálókhoz
Cserélje le az illesztő típusparaméterét IEquatable<T> az illesztőt megvalósító típusra.
Ha implementálja IEquatable<T>, felül kell bírálnia az alaposztály implementációit Equals(Object) is, így GetHashCode() azok viselkedése összhangban van a Equals(T) módszerével. Felülbírálás Equals(Object)esetén a rendszer meghívja a felülírt implementációt az osztály statikus Equals(System.Object, System.Object) metódusára irányuló hívásokban is. Emellett túl kell terhelnie az és op_Equality az op_Inequality operátorokat. Ez biztosítja, hogy az egyenlőség minden tesztje egységes eredményeket eredményez.
A felülírással Equals(Object)kapcsolatos információkért lásd: Equals(Object).
Értéktípus esetén mindig implementálnia IEquatable<T> kell és felül kell bírálnia Equals(Object) a jobb teljesítmény érdekében. Equals(Object) értéktípusokat jelöl meg, és az egyenlőség két értékének összehasonlítására támaszkodik. Mind a megvalósítás, Equals(T) mind a felülbírálás Equals(Object) konzisztens eredményeket ad vissza.
Implementálás IEquatable<T>esetén azt is implementálnia IComparable<T> kell, hogy a típuspéldányok rendezhetők vagy rendezhetők-e. Ha a típus implementál IComparable<T>, szinte mindig implementálhatja IEquatable<T>is.
Vegye figyelembe, hogy vannak olyan kialakítások, amelyekben egy típus támogatja a rendelési relációt, de az egyenlőség eltérhet a rendezési relációtól. Fontolja meg azt az osztályt Person , amelyben betűrendbe rendez. Két azonos nevű személy azonos, de nem ugyanaz a személy.
Metódusok
| Name | Description |
|---|---|
| Equals(T) |
Azt jelzi, hogy az aktuális objektum egyenlő-e egy másik, azonos típusú objektummal. |