Nếu bạn chỉ có một định nghĩa bình đẳng duy nhất cho lớp học của mình, bạn không thực sự cần triển khai bất kỳ giao diện nào: chỉ cần ghi đè phương thức Equals
. Mặc dù vậy, thực hành tốt nhất là triển khai IEquatable<T>
và ghi đè lên GetHashCode
một cách hợp lý (nếu bạn không ghi đè mã băm, bình đẳng sẽ hoạt động sai khi các lớp thu thập, phương pháp LINQ, vv sử dụng nó như là điều kiện tiên quyết cho sự bình đẳng). Dưới đây là một việc thực hiện mẫu:
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;
}
}
Điều này sẽ cho phép bạn làm:
Person savedPerson = ...
Person importedPerson = ...
bool hasChanged = !savedPerson.Equals(importedPerson);
Nếu, mặt khác, bạn có rất nhiều định nghĩa khác nhau về sự bình đẳng cho hoàn cảnh khác nhau, bạn đặt cược tốt nhất là viết lên các triển khai khác nhau IEqualityComparer<T>
. Dưới đây là một việc thực hiện mẫu:
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;
}
}
Trong trường hợp này, việc kiểm tra sẽ trông giống như:
Person savedPerson = ...
Person importedPerson = ...
IEqualityComparer<Person> comparer = ...
bool hasChanged = !comparer.Equals(savedPerson, importedPerson);
Đó là một câu hỏi hay. Tất cả sự so sánh khác nhau cũng làm tôi bối rối. – Greg