Suy đoán được giáo dục của tôi là làm cho mọi thứ hoạt động như các kiểu .NET được tạo sẵn, cụ thể là == sẽ hoạt động như bình đẳng tham chiếu nếu có thể và Equals sẽ hoạt động như bình đẳng giá trị khi có thể. Hãy xem xét sự khác biệt thực sự giữa ==
và Equals
:
object myObj = new Integer(4);
object myObj2 = new Integer(4);
//Note that == is only called if the ref'd objects are cast as a type
//overloading it.
myObj == myObj2; //False (???)
myObj.Equals(myObj2); //True (This call is virtual)
//Set the references equal to each other -- note that the operator==
//comparison now works.
myObj2 = myObj;
myObj == myObj2; //True
myObj.Equals(myObj2); //True
Hành vi này là tất nhiên không phù hợp và khó hiểu, đặc biệt là các lập trình viên mới - nhưng nó cho thấy sự khác biệt giữa sự so sánh tài liệu tham khảo và so sánh giá trị.
Nếu bạn làm theo hướng dẫn MSDN này, bạn đang làm theo hướng dẫn được thực hiện bởi các lớp quan trọng như chuỗi. Về cơ bản - nếu so sánh sử dụng ==
thành công, lập trình viên biết rằng so sánh đó sẽ luôn thành công, miễn là các tham chiếu liên quan không được gán cho các đối tượng mới. Các lập trình viên không bao giờ cần phải lo lắng về nội dung của các đối tượng là khác nhau, vì họ không bao giờ sẽ khác nhau:
//Mutable type
var mutable1 = new Mutable(1);
var mutable2 = mutable1;
mutable1 == mutable2; //true
mutable1.MutateToSomethingElse(56);
mutable1 == mutable2; //still true, even after modification
//This is consistent with the framework. (Because the references are the same,
//reference and value equality are the same.) Consider if == were overloaded,
//and there was a difference between reference and value equality:
var mutable1 = new Mutable(1);
var mutable2 = new Mutable(1);
mutable1 == mutable2; //true
mutable1.MutateToSomethingElse(56);
mutable1 == mutable2; //oops -- not true anymore
//This is inconsistent with, say, "string", because it cannot mutate.
Nó nắm để mà không có lý do kỹ thuật thực sự cho phương châm - nó chỉ là để duy trì phù hợp với phần còn lại của các lớp trong khung công tác.
Nguồn
2010-12-28 15:46:38
+1 đây rõ ràng là câu trả lời –
Rất tốt nghĩ ra câu trả lời tốt. – jason