2011-07-25 32 views
7

Tôi đã triển khai một lớp quá tải các toán tử ==!=.Ghi đè Nhà điều hành Bình đẳng

Điều này có vẻ hoạt động tốt; tuy nhiên, tôi nhận được cảnh báo 'type' defines operator == or operator != but does not override Object.Equals(object o).

OK, vì vậy, tôi đã thực hiện Bằng. Nhưng bây giờ tôi nhận được cảnh báo 'type' defines operator == or operator != but does not override Object.GetHashCode().

Điều này có kết thúc tại một thời điểm nào đó không? Hay tôi đã lang thang vào một yêu cầu không bao giờ kết thúc chỉ vì tôi muốn quá tải ==!=?

+3

Chỉnh sửa thuật ngữ nhanh: bạn không * ghi đè * toán tử - bạn * quá tải * chúng. –

+1

Khi bạn ghi đè 'Equals', bạn cũng cần ghi đè' GetHashCode', vì nó sẽ kiểm tra sự bình đẳng dựa trên hàm băm. –

+0

@IgorisAzanovas No, Equals sẽ không kiểm tra sự bình đẳng dựa trên hàm băm (trừ khi bạn quá tải và mã hóa nó theo cách đó). Hàm băm có sẵn để hỗ trợ các bộ sưu tập được băm và không được dự kiến ​​tạo ra một giá trị duy nhất, chỉ có một giá trị lý tưởng sẽ được sử dụng không thường xuyên. – Suncat2000

Trả lời

10

Điều này có kết thúc tại một thời điểm nào đó không?

Có, khi bạn triển khai GetHashCode nó sẽ kết thúc. Eric Lippertblogged about its importance. Tất cả những gì tôi có thể làm là đề nghị bạn đọc và tin tưởng anh ta :-)

+0

Được rồi, vì vậy bất cứ ai có thể trỏ đến một thuật toán tốt mà có thể chuyển đổi một giá trị số nguyên thành một giá trị băm hợp lý? –

+1

@Darin tại sao chúng ta cần ghi đè object.equals() khi chúng ta chỉ quá tải "==" toán tử? – Sandeep

+0

@Jonathon: nếu thông tin nhận dạng duy nhất của bạn là 'int', kiểu' int' được tích hợp sử dụng chính nó làm giá trị băm của nó. Nếu nó đủ tốt cho họ ... – porges

1

Có, nó sẽ kết thúc khi bạn ghi đè GetHashCode.

Khi thực hiện các toán tử bình đẳng và hơn nữa là Equals, nhà lập trình có trách nhiệm cung cấp triển khai để phân phối mã băm tùy chỉnh cho loại đó.

Xem this MSDN reference để biết chi tiết.

Các vấn đề liên quan