2013-06-27 7 views
21

संकलित करते समय कृपया इस व्यवहार को समझने में सहायता करें। जब मैं इस का उपयोग करें:सी # संकलन स्ट्रिंग

bool a1 = (object)("string" + 1) == ("string" + 1); 

परिणाम false

है लेकिन जब मैं इस

bool a2 = (object)("string" + "1") == ("string" + "1"); 

का उपयोग परिणाम true

तो, क्यों a1 != a2 है?

+0

मैं बिल्कुल पता नहीं क्यों, लेकिन मुझे पता है तुम स्ट्रिंग गुणवत्ता का उपयोग कर जाँच नहीं किया जाना चाहिए "==" वैसे भी। object1.equals (object2) कम से कम मेरी समझ के साथ जाने का तरीका है। मैंने इसे एक उत्तर के रूप में पोस्ट नहीं किया है क्योंकि यह शायद आपके प्रश्न का उत्तर नहीं देता है। –

+0

इसे जांचें: http://stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – Ani

+1

@Ricky Mutschlechner: ऑपरेटर '==' == '.equals' AFAIK। ;-) –

उत्तर

34

object पर कास्टिंग संदर्भ समानता तुलना को मजबूर करता है।

पहले मामले में दो अलग string ऑब्जेक्ट रनटाइम पर उत्पन्न होते हैं। चूंकि वे अलग-अलग उदाहरण हैं, परिणाम झूठा है।

दूसरे मामले में संकलक नोटिस करता है कि "string" + "1" हमेशा "string1" होने जा रहा है और स्ट्रिंग को इंटर्न करता है और दोनों स्थानों पर एक ही संदर्भ का उपयोग करता है। चूंकि यह एक ही स्ट्रिंग संदर्भ है, परिणाम सत्य है।

+2

@OP बस जोड़ने के लिए, आपको हमेशा स्ट्रिंग के साथ तारों की तुलना करना चाहिए। – Mataniko

+0

+1 के साथ। मुझे यह जवाब पसंद है। धन्यवाद :) –

+10

@Mataniko नहीं, आपको यह सुनिश्चित करना चाहिए कि यदि आप 'ऑपरेटर =='' का उपयोग करते हैं तो आपके चर एक संकलित समय प्रकार स्ट्रिंग के हैं। 'String.Equals' का उपयोग केवल तभी करें जब एक या अधिक ऑब्जेक्ट्स को 'स्ट्रिंग' पर स्थिर रूप से टाइप नहीं किया गया हो (जो वास्तव में बहुत दुर्लभ होना चाहिए)। – Servy

19

वहाँ दो महत्वपूर्ण बातें यहाँ पर जा रहे हैं:

पहले, अभिव्यक्ति "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 
+3

+1: पी –

+0

साफ। इस बात की जरुरत है कि कोई इस तरह आईएल को कैसे देखेगा? – kenchilada

+1

@radium व्यक्तिगत रूप से, मैं [ILSpy] (http://ilspy.net/) का उपयोग करता हूं। –

संबंधित मुद्दे