2013-04-23 10 views
14
Object t = 4; 
Object s = 4; 

if (t == s) {  // false 
} 

List<Object> q = new List<object>() { t }; 
Boolean found = q.Contains(s);   // found = true! 

उपर्युक्त कोड में, मैं t == sfalse लौटने से आश्चर्यचकित नहीं हूं; यह दो वस्तुओं के संदर्भों की तुलना कर रहा है और संदर्भ समान नहीं हैं।क्यों == से अलग वस्तुओं की तुलना करता है?

लेकिन मुझे हैरान है कि इसमें तथ्य वापस आ रहा है; जाहिर है कि यह ऑब्जेक्ट रेफरेंस की तुलना नहीं कर रहा है ... जैसा कि यह 4 और 4 के अनबॉक्स किए गए मानों की तुलना कर रहा है .. लेकिन यह तुलना करने के लिए वस्तुओं को अनबॉक्स करने के लिए कैसे और क्यों पता चलता है? मैं यहाँ खेलने पर बड़े pricniple समझने की कोशिश कर रहा हूँ।

+0

मेरा मानना ​​है कि 'ऑब्जेक्ट्स 'संदर्भ की तुलना में डिफ़ॉल्ट है जहां' ऑब्जेक्ट्स 'स्मृति में हैं, और चूंकि वे दो अलग-अलग वस्तुएं हैं; उनके पास स्मृति में दो अलग-अलग स्थान हैं। इसलिए वे '==' नहीं हैं। –

उत्तर

5

Contains प्रलेखन के अनुसार:

निर्धारित करता है एक दृश्य डिफ़ॉल्ट समानता comparer का उपयोग करके एक निर्दिष्ट तत्व शामिल है या नहीं।

2

Contains बजाय Equals तरीकों == ऑपरेटर का उपयोग करता है।

+3

दरअसल यह संभवतः 'समानता कॉम्पैयर का उपयोग करता है। डीफॉल्ट.क्वाल्स'। – DeCaf

+0

मुझे लगता है कि एक आभासी बराबर विधि ("डिफ़ॉल्ट तुलनाकर्ता") तुलना करने के लिए बुलाया जा रहा है .. लेकिन मैं कल्पना कर रहा हूं कि मेरे मामले में बुलाया जाने वाला तरीका ऑब्जेक्ट होना चाहिए। जैसा कि मैं कर रहा हूं ऑब्जेक्ट्स पर हैं। और यदि ऐसा है, तो ऑब्जेक्ट। एक्वाल्स सामग्री को अनबॉक्स करने और इनट्स के रूप में उनकी तुलना करने के लिए कैसे जानेंगे? –

+0

@DeCaf 'EqualityComparer । डीफॉल्ट 'हुड के नीचे' ऑब्जेक्ट। एक्वाल्स 'का उपयोग करता है। – MarcinJuraszek

-1

Containsobject.Equals(object) का उपयोग करता है, जो int एस के लिए लागू किया जाता है ताकि 4.equals(4) सत्य हो। प्रत्येक पक्ष पर ऑब्जेक्ट्स के साथ == केवल संदर्भ तुलना का उपयोग करता है।

यह भी ध्यान दें: object.Equals(t, s) == true क्योंकि this method संदर्भ समानता विफल होने पर इंस्टेंस की Equals विधि का उपयोग करता है।

7

Contains, आंतरिक रूप से, तत्वों की तुलना करने के लिए उदाहरण object.Equals विधि का उपयोग कर रहा है। यह == ऑपरेटर का उपयोग नहीं कर रहा है।

Equals विधि वर्चुअल है, जबकि == operator स्थिर है। इसका अर्थ यह है कि == ऑपरेटर निर्धारित करेगा कि परिवर्तनीय (और चर चलाने वाले ऑब्जेक्ट पर ऑब्जेक्ट नहीं) के संकलन समय प्रकार के आधार पर कौन सा कोड चलाना है। दूसरी ओर, एक वर्चुअल विधि स्थिर रूप से बाध्य नहीं है। यह के रन टाइम प्रकार के आधार पर चलाने के लिए Equals का ओवरलोड लोड करता है, वेरिएबल वैरिएबल मानते हैं।

0

== तुलना करने के लिए समानता का निर्धारण करने के लिए चर के प्रकार का उपयोग करता है।

object/object के लिए यह एक संदर्भ समानता करेगा।

ContainsEquals विधि का उपयोग करेगा जो वर्चुअल है और मूल्य तुलना करने के लिए अधिभारित किया जा सकता है। इस मामले में int इस तरह लिखा गया है।

+0

'==' कॉल करने के लिए कौन सी विधि निर्धारित करने के लिए ** परिवर्तनीय ** और ** ** ** प्रकार के प्रकार का उपयोग नहीं करता है। – Servy

12

अभिव्यक्ति

q.Contains(s) 

q का एक तत्व है जिसके लिए EqualityComparer<object>.Default.Equals(element, s) सच है के लिए लग रही है। बॉक्स किए गए प्राइमेटिव्स के लिए, यह मानों की तुलना करता है।

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