2009-11-09 33 views
6

muốn biết lý do tại sao Chuỗi hoạt động giống như loại giá trị trong khi sử dụng ==.Tại sao Chuỗi hoạt động giống như loại giá trị trong khi sử dụng ==

  String s1 = "Hello"; 
     String s2 = "Hello"; 
     Console.WriteLine(s1 == s2);// True(why? s1 and s2 are different) 
     Console.WriteLine(s1.Equals(s2));//True 
     StringBuilder a1 = new StringBuilder("Hi"); 
     StringBuilder a2 = new StringBuilder("Hi"); 
     Console.WriteLine(a1 == a2);//false 
     Console.WriteLine(a1.Equals(a2));//true 

StringBuilder and String hoạt động khác với toán tử ==. Cảm ơn.

Trả lời

18

Hai lý do khác nhau;

  • interning - kể từ chuỗi "Hello" (s) được biên soạn vào nguồn, họ cùng tham khảo - kiểm tra ReferenceEquals(s1,s2) - nó sẽ trở lại bình đẳng true
  • tùy chỉnh - chuỗi có nhà khai thác bình đẳng (nói riêng, ==/!= (aka op_Equality/op_Inequality)

phiên bản StringBuilder thất bại vì:

  • họ không tham chiếu cùng (đây là những đối tượng được quản lý thường xuyên tạo riêng trên heap quản lý)
  • StringBuilder không có các nhà khai thác

Gọi ToString() trên mỗi, và nó thú vị hơn:

  • hai chuỗi không phải là cùng một tham chiếu
  • nhưng sự hỗ trợ khai thác đảm bảo một true
+0

Cảm ơn bạn đã trả lời ur :-) – Wondering

+0

rất đúng .. rất đúng .. –

8

Toán tử == bị quá tải trong lớp String, theo cách làm cho giá trị chuỗi được so sánh thay vì tham chiếu đối tượng, là giá trị mặc định.

+0

bỏ phiếu cho bạn, cảm ơn bạn đã trợ giúp. – Wondering

3

Vì toán tử == được xác định lại cho chuỗi.

Xem MSDN

-2

Sử dụng == cho các chuỗi được thực tế xấu anyways, chỉ cần sử dụng Equals().

Details

+5

Và tại sao điều đó làm cho == thực hành xấu? Trong nội bộ, '==' chỉ gọi 'string.Equals (a, b)'; Tôi tìm thấy '==' rõ ràng hơn. Trường hợp phụ duy nhất ở đây là khi một tham số được gõ là 'đối tượng' - đó có phải là vấn đề bạn đang cố làm nổi bật không? –

+2

Không, cảm ơn. Một trong những điều tôi thực sự ghét khi chuyển từ C# sang Java là phải sử dụng Equals để so sánh các chuỗi. Tin hay không, nhưng == là dễ đọc hơn. – Konamiman

+4

Tôi nghĩ rằng equals chỉ hữu ích nếu bạn muốn sử dụng một trong các giá trị của Enchant StringComparison. – RichardOD

0

Đó là bởi vì các nhà điều hành bình đẳng đã được ghi đè để cung cấp các chức năng mà bạn nhìn thấy. Bạn có thể làm điều này trên bất kỳ loại nào bằng cách ghi đè toán tử bằng.

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