Tôi đã gặp phải tình huống này ngày hôm nay. Tôi có một đối tượng mà tôi đang thử nghiệm cho sự bình đẳng; phương thức Create() trả về việc thực hiện lớp con của MyObject.Khi nào có thể == b là sai và a.Equals (b) đúng?
MyObject a = MyObject.Create();
MyObject b = MyObject.Create();
a == b; // is false
a.Equals(b); // is true
Note Tôi cũng có Equals trên một thanh cuộn() trong việc thực hiện phân lớp, mà làm một kiểm tra rất cơ bản để xem có hay không các đối tượng thông qua trong là null và là loại của lớp con. Nếu cả hai điều kiện được đáp ứng, các đối tượng được coi là bằng nhau.
Điều hơi kỳ lạ khác là bộ phận thử nghiệm của tôi làm một số xét nghiệm tương tự như
Assert.AreEqual(MyObject.Create(), MyObject.Create()); // Green bar
và kết quả dự kiến được quan sát. Vì vậy, tôi đoán rằng NUnit sử dụng a.Equals (b) dưới bìa, chứ không phải là một == b như tôi đã giả định.
Lưu ý phụ: Tôi lập trình bằng hỗn hợp .NET và Java, vì vậy tôi có thể đang trộn lẫn các kỳ vọng/giả định của mình tại đây. Tôi nghĩ, tuy nhiên, rằng một == b làm việc nhất quán hơn trong NET hơn nó đã làm trong Java, nơi bạn thường phải sử dụng bằng() để kiểm tra bình đẳng.
CẬP NHẬT Đây là việc thực hiện các Equals(), theo yêu cầu:
b kiểm trapublic override bool Equals(object obj) {
return obj != null && obj is MyObjectSubclass;
}
Chúng tôi có thể thấy việc bạn triển khai ghi đè .Equals() – msarchet
Vui lòng đăng mã cho hàm Equals đã ghi đè hay không. – AxelEckenberger
khi một nhưng không phải cả hai đều được ghi đè lên tất nhiên :) – RCIX