Chỉ khi họ đang được sử dụng như một chìa khóa và bạn không muốn tương đương căn cứ vào thể hiện của đối tượng riêng của mình. Nếu bạn chỉ muốn tham chiếu đến cùng một trường hợp tương đương, bạn tốt và không cần làm gì cả, nhưng nếu bạn đang sử dụng kiểu của mình làm khóa và bạn muốn các trường hợp "tương đương" được xem là bằng nhau, lớp của bạn phải triển khai Equals()
và GetHashCode()
.
Nếu loại tùy chỉnh của bạn đang được lưu trữ dưới dạng giá trị và không được sử dụng làm khóa, điều này là không cần thiết, tất nhiên. Ví dụ: trong trường hợp này MyType không cần ghi đè Equals()
hoặc GetHashCode()
vì nó chỉ được sử dụng làm giá trị chứ không phải là khóa lưu trữ.
Dictionary<string, MyType> x;
Tuy nhiên trong trường hợp này:
Dictionary<MyType, string> x;
kiểu tùy chỉnh của bạn là chìa khóa, và do đó nó sẽ cần phải ghi đè Equals()
và GetHashCode()
. Các GetHashCode()
được sử dụng để xác định vị trí mà nó băm, và Equals()
được sử dụng để giải quyết va chạm trên mã băm (trong số những thứ khác).
Bạn cần ghi đè hai phương thức tương tự khi xử lý nhiều truy vấn LINQ
. Ngoài ra, bạn có thể cung cấp một lớp độc lập IEqualityComparer
ngoài lớp học của bạn để xác định xem hai trường hợp có tương đương hay không.
Nguồn
2012-01-06 14:52:51
Cảm ơn, một câu trả lời hay. – alan2here