2009-10-02 34 views
7

Tôi thấy điểm trong việc thực hiện rõ ràng Equals và GetHashCode cho các đối tượng của tôi.C# Triển khai toán tử bình đẳng rõ ràng cần thiết

Nhưng tôi tự hỏi, nếu nó làm cho bất kỳ ý nghĩa cũng để thực hiện một cách rõ ràng == và = nhà khai thác như thế này:!

public static bool operator ==(Salutation left, Salutation right) 
{ 
    return Equals(left, right); 
} 

Liệu C# không tự động sử dụng phương thức Equals khi == được gọi?

Trả lời

8

Thực sự có ý nghĩa khi ghi đè toán tử bình đẳng cùng với Equals. Đó là trong thực tế rất khuyến khích.

Microsoft đã đăng chính thức Guidelines for Implementing Equals and the Equality Operator (==) trên MSDN. Tôi chắc chắn sẽ đi theo các thực hành được đề nghị ở đó. Hai điểm chính là:

  • Thực hiện phương pháp GetHashCode bất cứ khi nào bạn thực hiện Equals phương pháp. Điều này giữ Equals và GetHashCode được đồng bộ hóa.
  • Ghi đè phương thức Bằng bất cứ khi nào bạn triển khai toán tử bình đẳng (==) và khiến chúng thực hiện tương tự. Điều này cho phép mã cơ sở hạ tầng như vậy dưới dạng Hashtable và ArrayList, sử dụng phương thức Equal , để thực hiện cùng một cách như mã người dùng được viết bằng cách sử dụng toán tử số .

Jon Skeet cũng đã viết một useful MSDN blog post về chủ đề này, tóm tắt như thế nào Equals và công việc == điều hành theo mặc định trên các loại tài liệu tham khảo/giá trị.

Các bộ phận quan trọng nhất được trích dẫn dưới đây:

Các Bằng phương pháp chỉ là một ảo một định nghĩa trong System.Object, và ghi đè bởi bất cứ lớp chọn để làm như vậy. Toán tử == là toán tử có thể bị quá tải bởi các lớp , nhưng thường có hành vi nhận dạng .

Đối với các loại tài liệu tham khảo nơi == chưa bị quá tải, nó so sánh dù hai tài liệu tham khảo tham khảo đến cùng đối tượng - đó là chính xác những gì thực hiện của Equals làm trong System.Object.

Loại giá trị không cung cấp quá tải cho == theo mặc định. Tuy nhiên, hầu hết các loại các loại giá trị được cung cấp bởi khung cung cấp quá tải của riêng chúng. Việc thực hiện mặc định của Equals cho một loại giá trị được cung cấp bởi ValueType, và sử dụng phản ánh để làm sự so sánh, mà làm cho nó chậm hơn so với một loại cụ thể thực hiện đáng kể thường sẽ. Việc thực hiện này cũng là các cuộc gọi Bằng với các cặp tham chiếu trong hai giá trị được so sánh.

+0

Cảm ơn. Tôi chấp nhận câu trả lời của bạn, nhưng bạn có thể vui lòng chỉnh sửa trong một số điều mà Joel đã nói không? Làm thế nào == hành xử nếu không overriden. – Tigraine

+0

@Tigraine: Không sao cả. Trên thực tế những gì Joel nói (và một thỏa thuận tốt hơn) là tất cả được đề cập trong trang tôi liên kết với, được viết bởi Jon Skeet. Tôi sẽ báo rằng nếu bạn thích. – Noldorin

+0

Cảm ơn .. :) Chỉ đọc dễ dàng như vậy;) – Tigraine

2

Nếu bạn không quá tải nó, == chỉ kiểm tra tính bình đẳng tham chiếu: cả hai bên có tham chiếu đến cùng một đối tượng không?

Nếu bạn cần giá trị bình đẳng (làm các đối tượng khác nhau trên cả hai mặt có cùng giá trị?), Bạn có thể quá tải toán tử. Tại thời điểm này, bạn hầu như luôn luôn muốn quá tải .Equals() và .GetHashCode() là tốt và chỉ có cuộc gọi quá tải == .Equals() của bạn.

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