वहाँ दो महत्वपूर्ण बातें यहाँ पर जा रहे हैं:
पहले, अभिव्यक्ति "string" + 1
रन-टाइम में मूल्यांकन किया जाता है, जबकि "string" + "1"
संकलन समय पर मूल्यांकन किया जाता है है।
दूसरा, आप संदर्भ तुलना का उपयोग कर रहे हैं। रन-टाइम जेनरेट स्ट्रिंग्स वास्तव में विभिन्न ऑब्जेक्ट का संदर्भ देते हैं जबकि संकलन-समय उत्पन्न स्ट्रिंग एक ही ऑब्जेक्ट का संदर्भ देते हैं, इसलिए पहली अभिव्यक्ति false
है और दूसरी अभिव्यक्ति true
है।
आप रुचि रखते हैं, उत्पन्न आईएल है:
// 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
स्रोत
2013-06-27 19:49:22
मैं बिल्कुल पता नहीं क्यों, लेकिन मुझे पता है तुम स्ट्रिंग गुणवत्ता का उपयोग कर जाँच नहीं किया जाना चाहिए "==" वैसे भी। object1.equals (object2) कम से कम मेरी समझ के साथ जाने का तरीका है। मैंने इसे एक उत्तर के रूप में पोस्ट नहीं किया है क्योंकि यह शायद आपके प्रश्न का उत्तर नहीं देता है। –
इसे जांचें: http://stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – Ani
@Ricky Mutschlechner: ऑपरेटर '==' == '.equals' AFAIK। ;-) –