Si solo tiene una definición única de igualdad para su clase, realmente no necesita implementar ninguna interfaz: simplemente anule el método Equals
. Sin embargo, la mejor práctica sería implementar IEquatable<T>
y anular GetHashCode
con sensatez (si no anula el código hash, la igualdad se comportará mal cuando las clases de recopilación, los métodos LINQ, etc., lo utilicen como condición previa para la igualdad). He aquí un ejemplo de implementación:
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;
}
}
Esto le permitirá hacer:
Person savedPerson = ...
Person importedPerson = ...
bool hasChanged = !savedPerson.Equals(importedPerson);
Si, por el contrario, usted tiene un montón de diferentes definiciones de la igualdad para diferentes circunstancias, su La mejor opción sería escribir diferentes implementaciones de IEqualityComparer<T>
. He aquí un ejemplo de implementación:
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;
}
}
En este caso, el cheque se verá así:
Person savedPerson = ...
Person importedPerson = ...
IEqualityComparer<Person> comparer = ...
bool hasChanged = !comparer.Equals(savedPerson, importedPerson);
Esa es una buena pregunta. Todas las diferentes comparaciones me confunden también. – Greg