Có hai điều quan trọng xảy ra ở đây:
Thứ nhất, Khái niệm "string" + 1
được đánh giá tại thời gian chạy trong khi "string" + "1"
được đánh giá tại thời gian biên dịch.
Thứ hai, bạn đang sử dụng so sánh tham chiếu. Các chuỗi thời gian chạy được tạo ra thực sự tham chiếu đến các đối tượng khác nhau trong khi các chuỗi tạo thời gian biên dịch tham chiếu cùng một đối tượng, do đó biểu thức đầu tiên là false
và biểu thức thứ hai là true
.
Nếu bạn quan tâm, IL tạo ra là:
// bool a1 = (object)("string" + 1) == ("string" + 1);
// bool a2 = (object)("string" + "1") == ("string" + "1");
IL_0000: ldstr "string"
IL_0005: ldc.i4.1
IL_0006: box System.Int32
IL_000B: call System.String.Concat
IL_0010: ldstr "string"
IL_0015: ldc.i4.1
IL_0016: box System.Int32
IL_001B: call System.String.Concat
IL_0020: ceq
IL_0022: stloc.0 // a1
IL_0023: ldstr "string1"
IL_0028: ldstr "string1"
IL_002D: ceq
IL_002F: stloc.1 // a2
Nguồn
2013-06-27 19:49:22
Tôi không biết chính xác lý do tại sao, nhưng tôi biết bạn không nên kiểm tra chất lượng chuỗi sử dụng "==" anyways. object1.equals (object2) là cách để đi với điều đó, ít nhất là để hiểu biết của tôi. Tôi đã không đăng bài này như là một câu trả lời mặc dù bởi vì nó có lẽ không trả lời câu hỏi của bạn. –
Kiểm tra điều này: http://stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – Ani
@Ricky Mutschlechner: AFAIK toán tử '==' == '.equals'. ;-) –