Если у вас есть только одно определение равенства для вашего класса, вам не нужно реализовывать какой-либо интерфейс: просто переопределите метод Equals
.Однако лучше всего было бы реализовать IEquatable<T>
и разумно переопределить GetHashCode
(если вы не переопределите хеш-код, равенство будет работать неправильно, когда классы коллекции, методы LINQ и т. Д. Используют егопредварительное условие равенства).Вот пример реализации:
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;
}
}
Это позволит вам сделать:
Person savedPerson = ...
Person importedPerson = ...
bool hasChanged = !savedPerson.Equals(importedPerson);
Если, с другой стороны, у вас есть много разных определений равенства дляПри других обстоятельствах лучше всего было бы написать различные реализации IEqualityComparer<T>
.Вот пример реализации:
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;
}
}
В этом случае проверка будет выглядеть следующим образом:
Person savedPerson = ...
Person importedPerson = ...
IEqualityComparer<Person> comparer = ...
bool hasChanged = !comparer.Equals(savedPerson, importedPerson);