2009-11-09 16 views
6

का उपयोग करते समय मूल्य प्रकार की तरह व्यवहार करता है जानना चाहते हैं क्यों स्ट्रिंग == का उपयोग करते समय मूल्य प्रकार की तरह व्यवहार करता है।क्यों स्ट्रिंग ==

  String s1 = "Hello"; 
     String s2 = "Hello"; 
     Console.WriteLine(s1 == s2);// True(why? s1 and s2 are different) 
     Console.WriteLine(s1.Equals(s2));//True 
     StringBuilder a1 = new StringBuilder("Hi"); 
     StringBuilder a2 = new StringBuilder("Hi"); 
     Console.WriteLine(a1 == a2);//false 
     Console.WriteLine(a1.Equals(a2));//true 

स्ट्रिंगबिल्डर और स्ट्रिंग == ऑपरेटर के साथ अलग-अलग व्यवहार करते हैं। धन्यवाद।

उत्तर

18

दो अलग कारणों से;

  • होना शामिल - के बाद से "Hello" स्ट्रिंग (रों) स्रोत में संकलित किया जाता है, वे हैं एक ही संदर्भ - जाँच ReferenceEquals(s1,s2) - यह true
  • कस्टम समानता वापस आ जाएगी - स्ट्रिंग समानता ऑपरेटरों (है विशेष रूप से, ==/!= (उर्फ op_Equality/op_Inequality)

StringBuilder संस्करण में विफल रहता है क्योंकि:

  • वे नहीं हैं एक ही संदर्भ (इन प्रबंधित ढेर पर अलग से बनाई गई नियमित प्रबंधित वस्तुओं रहे हैं)
  • StringBuilder ऑपरेटरों

कॉल ToString() प्रत्येक पर नहीं है, और यह और अधिक दिलचस्प हो जाता है:

  • दो तार नहीं हैं एक ही संदर्भ
  • लेकिन ऑपरेटर समर्थन एक true
+0

आपकी प्रतिक्रिया के लिए धन्यवाद :-) – Wondering

+0

इतना सच .. तो सच .. –

8

== ऑपरेटर String कक्षा में अधिभारित है, जिस तरह से ऑब्जेक्ट संदर्भों के बजाय स्ट्रिंग मानों की तुलना की जा सकती है, जो डिफ़ॉल्ट है।

+0

आपकी मदद के लिए धन्यवाद, मदद के लिए धन्यवाद। – Wondering

3

क्योंकि == ऑपरेटर स्ट्रिंग के लिए फिर से परिभाषित किया गया है।

देखें MSDN

-2

वैसे भी खराब व्यवहार का तार के लिए == का उपयोग करना है, बस बराबर का उपयोग()।

Details

+5

और यह == खराब अभ्यास क्यों करता है? आंतरिक रूप से, '==' बस 'स्ट्रिंग' कहता है। एक्वाल्स (ए, बी) '; मुझे '==' स्पष्ट लगता है। यहां एकमात्र साइड-केस तब होता है जब एक परम को 'ऑब्जेक्ट' के रूप में टाइप किया जाता है - क्या वह मुद्दा है जिसे आप हाइलाइट करने का प्रयास कर रहे हैं? –

+2

कोई धन्यवाद नहीं। सी # से जावा में जाने पर मुझे वास्तव में नफरत है, स्ट्रिंग की तुलना करने के लिए बराबर का उपयोग करना पड़ता है। मानो या नहीं, लेकिन == अधिक पठनीय है। – Konamiman

+4

मुझे लगता है कि बराबर केवल तभी उपयोगी होता है जब आप स्ट्रिंग कॉम्पैरिसन एनम के मानों में से किसी एक का उपयोग करना चाहते हैं। – RichardOD

0

क्योंकि समानता ऑपरेटर आप देख कार्यक्षमता प्रदान करने के अधिरोहित कर दिया गया है यह गारंटी देता है। आप बराबर ऑपरेटर को ओवरराइड करके किसी भी प्रकार से ऐसा कर सकते हैं।

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