2010-05-25 14 views
9

Hãy thử như sau trong cửa sổ Immediate:C# == nhà điều hành trong cửa sổ Immediate cư xử khác biệt so với tại thời gian chạy

object a1 = "a"; 
object a2 = "a"; 
a1==a2 // outputs false 

và bạn sẽ thấy rằng a1 == a2 đầu ra false.

Tuy nhiên, khi chạy trong hoặc một ứng dụng cửa sổ hoặc giao diện điều khiển, bạn sẽ nhận được true:

object t1 = "a"; 
object t2 = "a"; 
MessageBox.Show((t1 == t2).ToString()); // outputs true 

Các hành vi gian chạy là phù hợp với định nghĩa cho == điều hành và chuỗi.

Có ai biết nếu lỗi này trong cửa sổ ngay lập tức không?

+0

+1 chỉ vì tôi chưa bao giờ thấy cửa sổ ngay lập tức và có vẻ gọn gàng! – RichK

Trả lời

15

Điều bạn mô tả là hành vi đúng.

Định nghĩa của == trong Object so sánh tham chiếu đối số của nó. Điều này khác với việc triển khai == cho String so sánh các giá trị của các chuỗi. Các toán tử trong C# không phải là ảo. Điều này có nghĩa là mặc dù các đối tượng của bạn thực sự là chuỗi, vì loại tĩnh là object số == từ Object được gọi, nghĩa là so sánh tham chiếu sẽ được thực hiện.

Trong chuỗi C# có thể là interned trong hồ bơi thực tập. Thông thường, khi bạn tạo các chuỗi mới khi chạy, bạn sẽ nhận được một tham chiếu đến một đối tượng chuỗi hoàn toàn mới. Để nhận chuỗi nội bộ, bạn có thể gọi phương thức string.Intern. Tuy nhiên khi bạn biên dịch mã C#, các chuỗi ký tự được tự động thực hiện cho bạn vì vậy nếu bạn có cùng chuỗi ký tự ở hai vị trí trong mã của bạn, bạn sẽ nhận được một tham chiếu đến cùng một đối tượng chuỗi.

Trong cửa sổ ngay lập tức, các chuỗi dường như không được tập trung - các chuỗi mới được tạo mỗi lần ngay cả khi chúng có cùng giá trị. Nhưng không có yêu cầu trong .NET rằng tất cả các chuỗi phải được thực tập, vì vậy tôi không coi đây là lỗi.

Mã của bạn nên tránh dựa vào việc chuỗi có được thực tập vì đây là chi tiết triển khai hay không.

+3

Chỉ cần làm mọi thứ rõ ràng cho các toán tử OP: không tham gia vào đa hình, vì vậy trong trường hợp đó, việc thực thi 'Object' của' == 'được sử dụng, không phải là thực thi' String', do đó hành vi không mong muốn này. –

+0

Tôi không đồng ý với tuyên bố "đúng bahavior". Hành vi cửa sổ ngay lập tức không nhất quán với tài liệu MSDN và với thời gian chạy, thậm chí không với chính nó khi bạn đặt điểm ngắt và thực sự kiểm tra các biến có trong mã. Cá nhân tôi nghĩ Microsoft nên sửa lỗi này. –

+0

@Damiano: Ý của bạn là gì: "Hành vi cửa sổ ngay lập tức không nhất quán .. với chính nó khi bạn đặt điểm ngắt và thực sự kiểm tra các biến có trong mã."? Bạn có thể đưa ra một ví dụ không? "Hành vi cửa sổ ngay lập tức không phù hợp với tài liệu MSDN" Phần nào của tài liệu bạn đang đề cập đến? –

2

Đây không phải là lỗi; lý do mã thời gian chạy của bạn hoạt động là vì các chuỗi đó được thực thi (tức là chỉ có một biểu diễn của các chuỗi ký tự cụ thể đó trong bộ nhớ. Mỗi tham chiếu đến hằng số "a" là cùng một điểm trong bộ nhớ). Trong cửa sổ ngay lập tức, một chuỗi mới được tạo cho mỗi một chuỗi, do đó, trong khi nội dung của chúng giống nhau, các đối tượng trỏ đến các vị trí khác nhau trong bộ nhớ.

Sử dụng các nhà điều hành == trên một loại tài liệu tham khảo thực hiện một sự so sánh tài liệu tham khảo (trừ các loại cụ thể như các đối tượng đang được tham chiếu, không phải những gì đối tượng là --meaning object trong trường hợp này, không string --alters hành vi này). Bởi vì các chuỗi chữ được biên dịch được tập trung, chúng có cùng tham chiếu. Bởi vì các chuỗi cửa sổ ngay lập tức là các chuỗi mới, chúng không có cùng tham chiếu.

2

Có lẽ khi chạy trình biên dịch sẽ tối ưu hóa chuỗi ký tự để trỏ đến cùng một vị trí tham chiếu, nhưng trong cửa sổ ngay lập tức, tối ưu hóa này không xảy ra.

0

Tôi sẽ đề nghị rằng nếu bạn tắt tối ưu hóa thì phiên bản không trực tiếp cũng sẽ trả về giá trị sai. Như đã nói, đây không phải là một lỗi, đó là một sự lừa đảo do sự tối ưu hóa xảy ra bên trong trình biên dịch nhưng không nằm trong cửa sổ ngay lập tức.