2012-11-16 10 views
8

संभव डुप्लिकेट:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)क्यों ओवरराइडिंग == बराबर ओवरराइड करना चाहिए?

सी # संकलक मुझे संकेत देता है कि मैं ओवरराइड करना चाहिए के बराबर होती है, तो == अधिभावी, मैं सिर्फ जानना चाहता है कि करना चाहते हैं?

+3

संभावित डुप्लिकेट: http://stackoverflow.com/q/1222035/238902 – Default

+1

@ डिफॉल्ट वास्तव में, मुझे नहीं लगता कि यह एक डुप्लिकेट है - लेकिन वे जुड़े हुए हैं। यह एक है "जब प्रदान करते हैं ==, क्या मुझे बराबर ओवरराइड करना चाहिए?" (जिस पर उत्तर आम तौर पर है: हां), जहां-दूसरे के रूप में "बराबर ओवरराइड करते समय, क्या मुझे == प्रदान करना होगा?" (जिस पर उत्तर आम तौर पर है: नहीं, वास्तव में नहीं) –

उत्तर

4

क्योंकि अन्यथा आपके पास दो अर्थात् समान ऑपरेशन होंगे जो संभावित रूप से विभिन्न परिणामों को जन्म दे रहे हैं, जिसका अर्थ बहुत भ्रम है।

मुझे यकीन नहीं है कि संकलक आपको रोकता है या यदि यह केवल एक चेतावनी है, लेकिन किसी भी मामले में यह सुनिश्चित करना अच्छा होता है कि वे वही व्यवहार करते हैं।

double.NaN == double.NaN बनाम double.NaN.Equals(double.NaN) के साथ ऐसा कुछ है।

+0

+1: दिलचस्प, मुझे 'डबल.NAN.Equals (double.NaN) == true' के बारे में पता नहीं था। – Henrik

12

आप कर रहे हैं == के माध्यम से फिर से परिभाषित करने समानता, यह वास्तव में हो जाता है भ्रमित करता है, तो == बहुत .Equals करने के लिए अलग कुछ करता है, और .Equals फ़ॉलबैक हो सकता है क्योंकि जब प्रकार संकलन समय पर ज्ञात नहीं है, केवल .Equals है उपलब्ध। नतीजतन, == को परिभाषित करने का वास्तव में मतलब है: ==, !=, Equals और GetHashCode परिभाषित करना, और संभवतः को T के लिए लागू करना संभवतः।

+0

+1 हाँ, जब आप गलत पाते हैं तो 'डबल.NAN' डंक होता है :-) –

+0

सभी स्थितियों में समान रूप से व्यवहार करने के लिए '==' और' समान 'के लिए यह संभव नहीं है, और मुझे नहीं लगता कि उन्हें उम्मीद की जानी चाहिए । '==' उन स्थानों पर सुसंगत होने के लिए और अधिक उपयोगी होगा जहां यह प्रयोग योग्य है, और 'बराबर' हर जगह सुसंगत होने के लिए होगा (क्योंकि यह हर जगह उपयोग करने योग्य है)। एक नियम जो समान संख्या का प्रतिनिधित्व करने वाले संख्यात्मक प्रकारों को '==' की तुलना करनी चाहिए, भले ही वे अन्य संबंधों में भिन्न हों, जबकि केवल 100% समकक्ष चीजों की तुलना 'इक्विल्स' के रूप में की जानी चाहिए, क्या आईएमएचओ अब मौजूद मिशमोश ​​से अधिक सहायक होगा । – supercat

+0

जैसा कि है, उदाहरण के लिए परिभाषित करने का कोई अच्छा तरीका नहीं है। एक शब्दकोश जो 'दशमलव' मानों को उनके स्ट्रिंग प्रस्तुतियों पर मैप करेगा, क्योंकि एक शब्दकोश '1.0m' और '1.00m' संख्याओं को अलग नहीं कर सकता [जिनकी स्ट्रिंग प्रस्तुतियों को अलग करना चाहिए]। '==' ऑपरेटर को उन मानों को बराबर मानना ​​चाहिए, लेकिन इसका अर्थ यह नहीं है कि 'बराबर' होना चाहिए। इसके अलावा, जिस तरह से '==' अधिभार परिभाषित किया गया है, यह अक्सर एक समानता संबंध लागू करने में विफल रहता है और वास्तव में संख्यात्मक समानता के लिए परीक्षण नहीं करता है, उदाहरण के लिए '16777217 == 16777216.0f'। – supercat

1

क्योंकि अन्यथा आपको तुलना करने के तरीके के आधार पर अलग-अलग परिणाम मिलेंगे।

x == y कर y == x करने से एक अलग परिणाम दे सकता है (यदि x और y विभिन्न प्रकार हैं)। अन्य तुलना, जैसे किसी सूची में मूल्य की तलाश करना या किसी शब्दकोश में कुंजी के रूप में इसका उपयोग करना == ऑपरेटर का उपयोग नहीं करता है, इसलिए यह बिल्कुल काम नहीं करेगा।

+0

अलग क्यों हो सकता है? क्या करने का आदेश है? –

+0

@ MatíasFidemraizer: क्योंकि 'x == y'' x' मान पर '==' ऑपरेटर का उपयोग करेगा, लेकिन 'y == x'' y= मान पर '==' ऑपरेटर का उपयोग करेगा। अगर वे अलग-अलग लागू होते हैं (उदा।'y' डिफ़ॉल्ट ऑब्जेक्ट तुलना का उपयोग करता है) वे अलग-अलग परिणाम देते हैं। – Guffa

+0

आह, मैं देखता हूं। लेकिन ऐसा होगा यदि 'x' और' y' के अलग-अलग प्रकार हों। यदि दोनों के पास एक ही प्रकार है, तो 'x == y' या 'y == x' समान व्यवहार करना चाहिए। शायद आपको इसे हमारे उत्तर में इंगित करना चाहिए। –

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