2012-11-16 51 views
8

thể trùng lặp:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)Tại sao ghi đè == phải ghi đè bằng?

biên dịch C# nhắc nhở tôi rằng tôi nên ghi đè bằng nếu trọng ==, tôi chỉ muốn biết tại sao?

+3

có thể trùng lặp: http://stackoverflow.com/q/1222035/238902 – Default

+1

@Default thực sự, tôi không cho rằng đó là bản sao - nhưng chúng được liên kết. Điều này là "khi cung cấp ==, tôi có nên ghi đè bằng Equals không?" (mà câu trả lời thường là: có), ở đâu - như người kia là "khi trọng số bằng, tôi có phải cung cấp == không?" (mà câu trả lời thường là: không, không thực sự) –

Trả lời

4

Vì nếu không, bạn sẽ có hai hoạt động tương tự ngữ nghĩa có khả năng sinh ra các kết quả khác nhau, có nghĩa là rất nhiều nhầm lẫn.

Tôi không chắc liệu trình biên dịch có dừng lại hoặc nếu nó chỉ là cảnh báo, nhưng trong cả hai trường hợp, thường là tốt để đảm bảo chúng hoạt động giống nhau.

Có điều gì đó như thế này với double.NaN == double.NaN so với double.NaN.Equals(double.NaN).

+0

+1: thú vị, tôi đã không nhận thức được 'double.NaN.Equals (double.NaN) == true'. – Henrik

12

Nếu bạn đang tái xác định sự bình đẳng thông qua ==, nó được thực sự khó hiểu nếu == làm điều gì đó rất khác nhau để .Equals, và .Equals phải là dự phòng vì khi loại không được biết đến tại thời gian biên dịch, chỉ .Equals là có sẵn. Kết quả là, định nghĩa == thực sự có nghĩa là: xác định ==, !=, EqualsGetHashCode và có thể triển khai IEquatable<T> cho một số T.

+0

+1 Vâng, 'double.NaN' phát hiện khi bạn nhận được điều đó sai :-) –

+0

Không thể cho' == 'và' Equals' hoạt động giống nhau trong mọi tình huống, và tôi không nghĩ rằng chúng sẽ được mong đợi . Điều gì sẽ hữu ích hơn cho '==' để nhất quán ở những nơi có thể sử dụng được, và 'Equals' là nhất quán ở khắp mọi nơi (vì nó có thể sử dụng ở mọi nơi). Một quy tắc mà các kiểu số đại diện cho cùng một số nên so sánh '==', ngay cả khi chúng khác nhau về mặt khác, trong khi chỉ những thứ tương đương 100% nên so sánh với 'Equals', IMHO sẽ hữu ích hơn mishmosh tồn tại . – supercat

+0

Vì vậy, không có cách nào tốt đẹp để xác định ví dụ: một từ điển sẽ ánh xạ các giá trị 'Thập phân' tới các biểu diễn chuỗi của chúng, bởi vì một từ điển không thể phân biệt các số '1.0m' và' 1.00m' [có biểu diễn chuỗi khác nhau]. Toán tử '==' nên xem các giá trị đó bằng nhau, nhưng điều đó không có nghĩa là 'Equals' nên. Hơn nữa, cách thức '==' quá tải được xác định, nó thường không thực hiện một quan hệ tương đương và không thực sự kiểm tra sự bình đẳng bằng số, ví dụ: '16777217 == 16777216.0f'. – supercat

1

Vì nếu không, bạn sẽ nhận được các kết quả khác nhau tùy thuộc vào cách bạn so sánh.

Làm x == y có thể cho kết quả khác với việc thực hiện y == x (nếu xy là các loại khác nhau). Các so sánh khác, như tìm kiếm giá trị trong danh sách hoặc sử dụng giá trị đó làm khóa trong từ điển không sử dụng toán tử ==, do đó sẽ không hoạt động.

+0

Tại sao có thể khác? Những gì có trật tự để làm gì? –

+0

@ MatíasFidemraizer: Bởi vì 'x == y' sẽ sử dụng toán tử' == 'trên giá trị' x', nhưng 'y == x' sẽ sử dụng toán tử' == 'trên giá trị' y'. Nếu chúng được triển khai khác nhau (ví dụ:'y' sử dụng so sánh đối tượng mặc định) chúng cho kết quả khác nhau. – Guffa

+0

Ah, tôi hiểu rồi. Nhưng điều đó sẽ xảy ra nếu 'x' và' y' có các loại khác nhau. Nếu cả hai đều có cùng loại, 'x == y' hoặc' y == x' sẽ hoạt động theo cùng một cách. Có lẽ bạn nên chỉ ra điều này trong câu trả lời của chúng tôi. –