2012-03-03 7 views
21

msdnआईएसट्रक्चरल एक्वाटेबल बनाम बराबर?

IStructuralEquatable

के अनुसार परिभाषित करता है तरीकों संरचनात्मक समानता के लिए वस्तुओं की तुलना का समर्थन करने के। संरचनात्मक समानता का अर्थ है कि दो वस्तुएं बराबर हैं क्योंकि उनके बराबर मान हैं। यह संदर्भ समानता से अलग है, जो इंगित करता है कि दो ऑब्जेक्ट संदर्भ बराबर हैं क्योंकि वे को उसी भौतिक वस्तु का संदर्भ देते हैं।

क्या यह Equals नहीं करना चाहिए? (IEquatable ओवरराइड करते समय)?

+0

@CodeInChaos मेरे पढ़ने से - यह केवल समग्र प्रकारों (जिसमें कुछ तत्व शामिल हैं) .... सही है? - अन्यथा - अगर यह केवल एक वस्तु थी - मैं बराबर लागू कर सकता था ....? –

+1

मेरी समझ यह है कि इसका उपयोग प्रकारों के संग्रह के लिए किया जाता है, और तुलना के संरचनात्मक भाग को घेरता है, लेकिन तत्वों की तुलना उपयोगकर्ता द्वारा पारित तुलनात्मक तुलना में किया जाता है। लेकिन मुझे सच में यकीन नहीं है कि मुझे वास्तव में यह मिला है। – CodesInChaos

+0

http://stackoverflow.com/a/5601068/445517 लेकिन मुझे लगता है कि स्वीकार्य उत्तर अभी भी है (उसने दावा किया है कि इसे गलत किया गया है) गलत/'ISक्ट्रक्चरल एक्वाटेबल 'का बिंदु नहीं मिला। – CodesInChaos

उत्तर

2

कारण आपको आईएसट्रक्चरल एक्वाटेबल की आवश्यकता है, यह तुलना के नए तरीके को परिभाषित करने के लिए है जो सभी ऑब्जेक्ट्स के लिए सही होगा।

IStructuralEquatable इंटरफ़ेस आपको संग्रह वस्तुओं की संरचनात्मक समानता के लिए जाँच करने के लिए अनुकूलित तुलना लागू करने के लिए सक्षम बनाता है। यही है, आप संरचनात्मक समानता की अपनी परिभाषा बना सकते हैं और निर्दिष्ट कर सकते हैं कि इस परिभाषा का उपयोग संग्रह प्रकार के साथ किया जा सकता है जो ISTructuralEquatable इंटरफ़ेस को स्वीकार करता है।

उदाहरण के लिए यदि आप एक सूची चाहते हैं जो अपने सभी तत्वों को एक विशिष्ट परिभाषा से सॉर्ट करेगी। इस मामले में आप अपने वर्ग कार्यान्वयन को बदलना नहीं चाहते हैं, इसलिए आप समान विधि को ओवरराइड नहीं करना चाहते हैं।

यह आपके आवेदन में वस्तुओं की तुलना करने के लिए एक सामान्य तरीका परिभाषित करेगा।

0

बराबर का अनुबंध ISTructuralEquatable से अलग है, जिसमें यह इंगित करता है कि 2 ऑब्जेक्ट तर्कसंगत बराबर हैं।

डिफ़ॉल्ट रूप से, संदर्भ प्रकार पर बराबर इंगित करता है कि दो ऑब्जेक्ट संदर्भ एक ही ऑब्जेक्ट उदाहरण का संदर्भ देते हैं या नहीं। हालांकि, आप अपने आवेदन के तर्क के अनुसार बराबर ओवरराइड करने में सक्षम हैं।

उदाहरण के तौर पर, यह कर्मचारी वर्ग के दो अलग-अलग उदाहरणों के बराबर माना जा सकता है यदि वे दोनों आपके सिस्टम में एक ही इकाई का प्रतिनिधित्व करते हैं। इसे प्राप्त करने के लिए, एसएसएन गुणों के साथ कर्मचारी वस्तुओं को तर्कसंगत रूप से बराबर माना जाएगा, भले ही वे संरचनात्मक रूप से बराबर न हों।

+4

एर देख सकूं ... यदि आप * लॉजिकल * समकक्ष चाहते हैं, तो आप ऑब्जेक्ट। एक्वाल्स (ऑब्जेक्ट अन्य) ओवरराइड करते हैं। यदि आप * रेफरेंशियल * समतुल्य चाहते हैं, तो आप इसे ओवरराइड नहीं करते हैं।यदि आपके पास 'स्ट्रक्चर' है, और आप * लॉजिकल * तुलना (जो आप लगभग हमेशा करते हैं) चाहते हैं, तो आप उस विधि को ओवरराइड करते हैं, और आप 'IEquatable इक्वल्स (टी अन्य)' को भी लागू करते हैं। लेकिन आपको कभी भी 'आईस्ट्रक्चरल एक्वाटेबल' की आवश्यकता क्यों होगी? – Mehrdad

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