Se si dispone di un'unica definizione di uguaglianza per la classe, non è necessario implementare alcuna interfaccia: basta sovrascrivere il metodo Equals
. Tuttavia, la migliore pratica sarebbe quella di implementare IEquatable<T>
e di ridefinire sensibilmente GetHashCode
(se non si sostituisce il codice hash, l'uguaglianza si comporta in modo anomalo quando le classi di raccolta, i metodi LINQ ecc. Lo usano come pre-condizione per l'uguaglianza). Ecco un esempio di implementazione:
public class Person : IEquatable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public override int GetHashCode()
{
return (Name == null ? 0 : Name.GetHashCode())^Age;
}
public override bool Equals(object obj)
{
return Equals(obj as Person);
}
public bool Equals(Person other)
{
return other != null && other.Name == Name && other.Age == Age;
}
}
Questo vi permetterà di fare:
Person savedPerson = ...
Person importedPerson = ...
bool hasChanged = !savedPerson.Equals(importedPerson);
Se, d'altra parte, si ha un sacco di differenti definizioni di uguaglianza per circostanze diverse, la vostra la soluzione migliore sarebbe scrivere diverse implementazioni IEqualityComparer<T>
. Ecco un esempio di implementazione:
public class AgeComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return (x == null || y == null) ? x == y : x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj == null ? 0 : obj.Age;
}
}
In questo caso, il controllo sarà simile:
Person savedPerson = ...
Person importedPerson = ...
IEqualityComparer<Person> comparer = ...
bool hasChanged = !comparer.Equals(savedPerson, importedPerson);
Questa è una buona domanda. Tutti i diversi confronti confondono anche me. – Greg