2016-03-11 19 views
5

Tôi biết điều này có vẻ giống như một câu hỏi rất ngu ngốc nhưng tôi không có câu trả lời cho câu hỏi này. Một trong những người dùng của chúng tôi đã báo cáo lỗi gần đây và tôi nhận thấy rằng một đoạn mã cũ đang sử dụng != string.Empty thay vì IsNullOrEmpty(). Tôi đã sửa nó với IsNullOrEmpty() và nó bây giờ chạy tốt, nhưng tôi muốn thực sự hiểu vấn đềSo sánh các chuỗi với toán tử! = Cho kết quả khác nhau?

Vấn đề là, cùng một bit mã chạy khác nhau trên một số máy nhất định. Về cơ bản tôi có một đối tượng: context["MODE"], được cho là rỗng. Tôi thêm một số xét nghiệm về nó để đăng nhập:

 contextBuilder.AppendLine("MODE: |" + context["MODE"] + "|"); 
     contextBuilder.AppendLine("MODE != string.Empty: " + (context["MODE"] != string.Empty)); 
     contextBuilder.AppendLine("MODE TRIM != string.Empty: " + (context["MODE"].ToString().Trim() != string.Empty)); 
     contextBuilder.AppendLine("MODE.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString())); 
     contextBuilder.AppendLine("MODE.TRIM.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString().Trim())); 

Dưới đây là các bản ghi của tôi về điều đó chi tiết lĩnh vực:

MODE: || 
MODE != string.Empty: False 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

Dưới đây là các bản ghi của mình:

MODE: || 
MODE != string.Empty: True 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

Như bạn có thể thấy có một sự khác biệt: MODE != string.Empty là sai cho tôi (có ý nghĩa), True cho anh ta! MODE rõ ràng là không null (nếu không .ToString() sẽ không thành công) Vấn đề được cố định bằng cách sử dụng IsNullOrEmpty nhưng tôi đang cố gắng tìm ra chính xác lý do tại sao điều này không hoạt động trên các máy của người dùng nhất định và không hoạt động. Thông thường với các bài kiểm tra của tôi một số người trong chúng ta không có vấn đề, khác đã có.

Tôi không thực sự hiểu những gì tôi có thể tìm hiểu về nó. Tại sao chế độ của anh ta khác với null và String.Empty, nhưng IsNullOrEmpty trả về true? Ngoài ra, hãy lưu ý rằng hình cắt cũng thực sự là string.Empty cũng như

Cảm ơn bạn!

+1

'IsNullOrEmpty' thực hiện các phần rỗng bằng cách so sánh' Length' để 0. – juharr

+1

Hãy thử cũng in ra 'bối cảnh [ "Chế độ"]. GetType(). Tên 'là tốt. – juharr

+0

Bạn có thể cung cấp thêm chi tiết về nguồn gốc của giá trị trong 'context [" MODE "]'? Ngoài ra, bạn đã đảm bảo các phiên bản .NET có giống nhau trên cả hai máy không? –

Trả lời

4

Nếu bạn sử dụng ToString(), đó là dấu hiệu cho thấy loại context["MODE"]object. Nếu bạn so sánh một đối tượng với một chuỗi bằng cách sử dụng !=, bạn đang so sánh các tham chiếu chuỗi, chứ không phải giá trị chuỗi thực tế.

Vì vậy, "chế độ của anh ấy" là một chuỗi trống không có cùng tham chiếu như string.Empty.

Không sử dụng so sánh tham chiếu trên chuỗi; luôn đảm bảo cả hai bên đều thuộc loại string trước khi sử dụng == hoặc !=.

Lưu ý rằng trình biên dịch C# nên đã cảnh báo bạn về vấn đề này: CS0252: Possible unintended reference comparison

+0

@clcto Đó là đầu ra chính xác, bởi vì không bằng 'String.Empty' trả về false, có nghĩa là nó _is_ bằng' String.Empty' – Setsu

+0

Như tôi đã nói đây là một đoạn mã cũ, được viết bởi người đang dùng chăm sóc ứng dụng trước khi tôi gia nhập công ty ở đây (và yup, có một cảnh báo anh ấy đã bỏ lỡ!). Tôi khá tự hỏi tại sao kết quả của anh ấy theo cách này? Đầu vào của anh ta trống rỗng, nhưng không có tham chiếu giống như 'string.Empty'. Tuy nhiên khi tôi cắt nó nó có cùng một tham chiếu! Làm thế nào điều này có thể xảy ra? – Damascus

+0

Kiểu trả về của 'Trim()' là 'chuỗi', do đó trình biên dịch sử dụng một so sánh giá trị trong trường hợp đó. – Daniel

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