ऑपरेटर ==
स्थैतिक, आभासी नहीं है, इसलिए व्यवहार स्थिर प्रकार द्वारा निर्धारित होता है, न कि रनटाइम प्रकार। संदर्भ प्रकार की वस्तुओं पर डिफ़ॉल्ट==
के लिए कार्यान्वयन संदर्भों की तुलना करना है (हालांकि प्रकार एक अलग व्यवहार को लागू कर सकते हैं, उदाहरण के लिए string
)। आपके पास दो अलग-अलग वस्तुएं हैं और उनके पास समान संदर्भ नहीं है इसलिए ==
झूठी रिटर्न देता है।
समाधान, जैसा कि आप इंगित करते हैं, बराबर का उपयोग करना है। बराबर एक वर्चुअल विधि है। चूंकि value1
में रनटाइम प्रकार Int32
है, तो आप Int32.Equals पर कॉल करना समाप्त कर देते हैं। नेट परावर्तक से आप देख सकते हैं इस प्रकार है कि इस के कार्यान्वयन:
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
दूसरे शब्दों में, यह जाँच करता है, तो तर्क प्रकार int
की है, और इसलिए यह डाले और ==
कि के लिए परिभाषित किया गया है का उपयोग करता है int
। यह पूर्णांक के मान की तुलना करता है।
Equals() विधि के साथ जाने के लिए इसे ठीक करने का एकमात्र तरीका है?
एक वैकल्पिक Int32.Equals
के कार्यान्वयन करता है बस के रूप में, int
करने के लिए अपने वस्तुओं डाली और फिर ==
उपयोग करने के लिए है।
स्रोत
2010-08-12 17:03:31
कहते हैं कि वे बराबर हैं लेकिन दो अलग-अलग उदाहरण –
दोस्त, == और 2. दो अलग-अलग चीजें करते हैं। == ऑपरेटर यह देखने के लिए जांच करता है कि क्या val1 और val2 एक ही मेमोरी स्पेस (संदर्भ) पर कब्जा करते हैं। सामग्री समानता के लिए जांच करता है। – Icemanind
आप 'object.Equals (ऑब्जेक्ट, ऑब्जेक्ट) 'स्थैतिक विधि का भी उपयोग कर सकते हैं, जो पहले' == 'ऑपरेटर का उपयोग करके ऑब्जेक्ट्स की तुलना करने का प्रयास करता है और फिर' ऑब्जेक्ट्स। एक्वाल्स (ऑब्जेक्ट) 'विधि का प्रयास करता है यदि दोनों पैरामीटर हैं अशक्त नहीं। कारण मैं इसका सुझाव देता हूं कि आपको ऑब्जेक्ट को कॉल करने से पहले शून्य की जांच करने की आवश्यकता नहीं है। एक्सेल (ऑब्जेक्ट, ऑब्जेक्ट) ', जबकि आप करते हैं तो आप ऑब्जेक्ट को कॉल करते हैं। एक्वाल्स (ऑब्जेक्ट)'। –