IEquatable<T> Rozhraní
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Definuje generalizovanou metodu, kterou typ hodnoty nebo třída implementuje k vytvoření metody specifické pro typ pro určení rovnosti instancí.
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 objektů, které chcete porovnat.
- Odvozené
Příklady
Následující příklad ukazuje částečnou Person implementaci třídy, která implementuje IEquatable<T> a má dvě vlastnosti, LastName a NationalId.
NationalId je považován za jedinečný identifikátor, proto Equals metoda vrátí True , pokud NationalId je vlastnost dvou Person objektů identická; v opačném případě vrátí False.
(Všimněte si, že příklad jazyka F# nezpracuje null hodnoty pro Person instance.)
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
Poznámky
Toto rozhraní je implementováno pomocí typů, jejichž hodnoty lze rovníkovat (například číselné a řetězcové třídy). Typ hodnoty nebo třída implementuje metodu Equals pro vytvoření metody specifické pro typ vhodný pro určení rovnosti instancí.
Poznámka
Rozhraní IComparable<T> definuje metodu CompareTo , která určuje pořadí řazení instancí implementového typu. Rozhraní IEquatable<T> definuje metodu Equals , která určuje rovnost instancí implementového typu.
Rozhraní IEquatable<T> se používá obecnými objekty kolekce, jako Dictionary<TKey,TValue>je , List<T>a LinkedList<T> při testování rovnosti v takových metodách jako Contains, IndexOf, LastIndexOfa Remove. Měla by být implementována pro všechny objekty, které by mohly být uloženy v obecné kolekci.
Další informace o implementaci IEquatable<T> rozhraní naleznete v poznámkách k IEquatable<T>.Equals metodě.
Poznámky pro implementátory
Nahraďte parametr IEquatable<T> typu rozhraní typem, který implementuje toto rozhraní.
Pokud implementujete IEquatable<T>, měli byste také přepsat implementace Equals(Object) základní třídy a GetHashCode() tak, aby jejich chování bylo konzistentní s metodou Equals(T) . Pokud přepíšete Equals(Object), přepsaná implementace se také volá ve volání statické Equals(System.Object, System.Object) metody ve vaší třídě. Kromě toho byste měli přetížit operátory op_Equality a op_Inequality operátory. Tím zajistíte, že všechny testy rovnosti vrátí konzistentní výsledky.
Informace o přepsání Equals(Object)naleznete v tématu Equals(Object).
Pro typ hodnoty byste měli vždy implementovat IEquatable<T> a přepsat Equals(Object) pro lepší výkon. Equals(Object) Typy hodnot polí a spoléhá na reflexi při porovnání dvou hodnot rovnosti. Implementace Equals(T) i přepsání Equals(Object) by měly vrátit konzistentní výsledky.
Pokud implementujete IEquatable<T>, měli byste také implementovat IComparable<T> , pokud je možné řadit nebo řadit instance typu. Pokud váš typ implementuje IComparable<T>, téměř vždy také implementujete IEquatable<T>.
Všimněte si, že existuje několik návrhů, ve kterých typ podporuje relaci pořadí, ale rovnost se může lišit od relace řazení.
Person Představte si třídu, ve které seřadíte abecedně. Dva lidé se stejným jménem se seřadí stejné, ale nejsou stejní.
Metody
| Name | Description |
|---|---|
| Equals(T) |
Určuje, zda je aktuální objekt roven jinému objektu stejného typu. |