IEquatable<T> Gränssnitt
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Definierar en generaliserad metod som en värdetyp eller klass implementerar för att skapa en typspecifik metod för att fastställa likheten mellan instanser.
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)
Typparametrar
- T
Vilken typ av objekt som ska jämföras.
- Härledda
Exempel
I följande exempel visas den partiella implementeringen av en Person klass som implementerar IEquatable<T> och har två egenskaper, LastName och NationalId.
NationalId anses vara en unik identifierare, därför Equals returnerar True metoden om NationalId egenskapen för två Person objekt är identisk. Annars returneras False.
(Observera att F#-exemplet inte hanterar null värden för Person instanser.)
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
Kommentarer
Det här gränssnittet implementeras av typer vars värden kan likställas (till exempel numeriska klasser och strängklasser). En värdetyp eller klass implementerar Equals metoden för att skapa en typspecifik metod som är lämplig för att fastställa likheten mellan instanser.
Note
Gränssnittet IComparable<T> definierar CompareTo metoden, som avgör sorteringsordningen för instanser av implementeringstypen. Gränssnittet IEquatable<T> definierar Equals metoden, som avgör likheten mellan instanser av implementeringstypen.
Gränssnittet IEquatable<T> används av generiska samlingsobjekt som Dictionary<TKey,TValue>, List<T>och LinkedList<T> vid testning av likhet i metoder som Contains, IndexOf, LastIndexOfoch Remove. Den bör implementeras för alla objekt som kan lagras i en allmän samling.
Mer information om hur du implementerar IEquatable<T> gränssnittet finns i anmärkningar om IEquatable<T>.Equals metoden.
Anteckningar till implementerare
Ersätt typparametern för IEquatable<T> gränssnittet med den typ som implementerar det här gränssnittet.
Om du implementerar IEquatable<T>bör du också åsidosätta basklassimplementeringarna för Equals(Object) och GetHashCode() så att deras beteende överensstämmer med Equals(T) metodens. Om du åsidosätter Equals(Object)anropas även den åsidosättna implementeringen i anrop till den statiska Equals(System.Object, System.Object) metoden i klassen. Dessutom bör du överbelasta operatorerna op_Equality och op_Inequality . Detta säkerställer att alla tester för likhet returnerar konsekventa resultat.
Information om åsidosätter Equals(Object)finns i Equals(Object).
För en värdetyp bör du alltid implementera IEquatable<T> och åsidosätta Equals(Object) för bättre prestanda. Equals(Object) rutorna värdetyper och förlitar sig på reflektion för att jämföra två värden för likhet. Både implementeringen av Equals(T) och åsidosättningen av Equals(Object) bör returnera konsekventa resultat.
Om du implementerar IEquatable<T>bör du även implementera IComparable<T> om instanser av din typ kan ordnas eller sorteras. Om din typ implementerar implementerar IComparable<T>IEquatable<T>du nästan alltid också .
Observera att det finns vissa mönster där en typ stöder en orderrelation, men likheten kan skilja sig från en orderrelation. Tänk dig en Person klass där du sorterar alfabetiskt. Två personer med samma namn sorterar samma, men är inte samma person.
Metoder
| Name | Description |
|---|---|
| Equals(T) |
Anger om det aktuella objektet är lika med ett annat objekt av samma typ. |