2013-05-05 59 views
26

Tôi có câu hỏi về Object.EqualsEquals(object). mẫu mã của tôi là dưới đây:C# Sự khác biệt giữa toán tử ==, StringBuilder.Equals, Object.Equals và Object.ReferenceEquals

class Program 
{ 
    static void Main(string[] args) 
    { 
     var sb1 = new StringBuilder("Food"); 
     var sb2 = new StringBuilder("Food"); 
     Console.WriteLine(sb1 == sb2); 
     Console.WriteLine(sb1.Equals(sb2)); 
     Console.WriteLine(Object.Equals(sb1, sb2)); 
     Console.WriteLine(Object.ReferenceEquals(sb1, sb2)); 
     Console.ReadLine(); 
    } 
} 

Đầu ra là:

False 
True 
False 
False 

Nhưng như xa như tôi quan tâm Object.Equals(sb1, sb2) nội bộ gọi sb1.Equals(sb2) vậy tại sao không đưa ra hai kết quả khác nhau?

+0

Bạn nên đưa ra tiêu đề câu hỏi tốt hơn. Dòng điện không có nghĩa gì cả. Vui lòng không lặp lại các thẻ trong tiêu đề. –

+0

@ReferenceEquals: Bạn so sánh bốn phương pháp so sánh. Tôi đã sửa đổi tiêu đề của bạn để phản ánh câu hỏi của bạn tốt hơn một chút. –

+3

Tại sao bạn kiểm tra sự bình đẳng trên 2 trình xây dựng chuỗi? Nó giống như kiểm tra một dòng hoặc viết chữ cho sự bình đẳng. – leppie

Trả lời

17

Bạn đang thiếu bài kiểm tra khác:

Console.WriteLine(sb1.Equals((object)sb2)); // False! 

StringBuilder không ghi đè Equals(object), nó quá tải nó với Equals(StringBuilder) khác.

Object.Equals(object, object) đang gọi số Equals(object), vì vậy kết quả là sai.

+0

Quá tải 'Bằng’ mà không ghi đè lên. WTF đã làm họ nghĩ. Cá nhân tôi đã sử dụng bình đẳng tham chiếu, nhưng lựa chọn này chỉ là khó hiểu. – CodesInChaos

+1

Bạn nên giải thích về sự khác biệt giữa ['Object.Equals()'] (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx) và ['IEquatable '] (http: // msdn.microsoft.com/en-us/library/ms131187.aspx) –

+0

Vì chúng tôi có hai tham chiếu khác nhau (đối tượng, thể hiện) và mặc định bằng (đối tượng) nên trả về so sánh tham chiếu trước. – Uzzy

4

Bạn đang sử dụng 4 phương pháp khác nhau để so sánh, dẫn đến kết quả khác nhau:

  • hành == Mặc định nó sẽ làm một kiểm tra nếu các tài liệu tham khảo đều bình đẳng. Trong trường hợp này, bạn có hai trường hợp, vì vậy chúng có hai tham chiếu khác nhau. Hành vi của == có thể bị ghi đè bởi bất kỳ loại nào (như string có phương pháp so sánh riêng), nhưng trong trường hợp của StringBuilder thì không.
  • Phương pháp StringBuilder.Equals(StringBuilder) sẽ so sánh với một StringBuilder khác và so sánh một số giá trị bên trong. Những giá trị này, trong trường hợp của bạn, giống nhau. Điều kỳ lạ là StringBuilder không ghi đè phương thức StringBuilder.Equals(object) để áp dụng cùng một logic.
  • Phương thức object.Equals(object, object) sẽ cố gắng gọi phương thức .Equals(object) của một trong các đối tượng. Trong trường hợp này: StringBuilder.Equals(object), như tôi đã nói, không có logic để so sánh các giá trị. Kết quả chỉ là so sánh các tham chiếu của cả hai trường hợp.
  • Object.ReferenceEquals sẽ chỉ so sánh các tham chiếu.

Mọi chi tiết, xem:

3

StringBuilder.equals không so sánh các đối tượng mà là từ MSDN:

"True nếu trường hợp này và sb có bằng chuỗi, Công suất, và MaxCapacity giá trị; nếu không, sai. "

Phần còn lại của séc bạn đang so sánh tham chiếu.

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