2009-10-02 16 views
7

मैं स्पष्ट रूप से मेरे ऑब्जेक्ट्स के लिए बराबर और GetHashCode को लागू करने में बिंदु देखता हूं।सी # स्पष्ट समानता ऑपरेटर कार्यान्वयन आवश्यक

लेकिन मुझे आश्चर्य है अगर यह किसी भी समझ में आता है यह भी स्पष्ट रूप से == इसके क्रियान्वयन और = इस तरह ऑपरेटरों:

public static bool operator ==(Salutation left, Salutation right) 
{ 
    return Equals(left, right); 
} 

करता सी जब == शुरू हो जाती है स्वचालित रूप से बराबर विधि का उपयोग नहीं #?

उत्तर

8

यह वास्तव में समानता ऑपरेटर को Equals के साथ ओवरराइड करने का अर्थ बना देता है। यह वास्तव में अत्यधिक सलाह दी है।

माइक्रोसॉफ्ट ने एमएसडीएन पर आधिकारिक Guidelines for Implementing Equals and the Equality Operator (==) पोस्ट किया है। मैं निश्चित रूप से वहां अनुशंसित अभ्यास से जाना होगा। दो मुख्य बिंदु निम्न हैं:

  • लागू GetHashCode विधि जब भी आप बराबर विधि को लागू। यह बराबर और GetHashCode सिंक्रनाइज़ करता है।
  • जब भी आप समानता ऑपरेटर (==) लागू करते हैं, तो समानता विधि को ओवरराइड करें, और उन्हें वही कार्य करें। यह हैशटेबल और ऐरेलिस्ट के रूप में आधारभूत संरचना कोड की अनुमति देता है, जो समान उपयोग विधि का उपयोग करता है, व्यवहार करने के लिए समानता ऑपरेटर का उपयोग करके उपयोगकर्ता कोड लिखा गया है।

जॉन स्कीट भी विषय के बारे में एक useful MSDN blog post लिखा था, का सारांश कैसे Equals और संदर्भ/मूल्य प्रकार पर डिफ़ॉल्ट रूप से == ऑपरेटर काम करते हैं।

सबसे महत्वपूर्ण भागों नीचे उद्धृत कर रहे हैं:

बराबर विधि सिर्फ एक आभासी एक System.Object में परिभाषित किया गया है, और जो भी कक्षाएं चुनें द्वारा ओवरराइड ऐसा करने के लिए है। == ऑपरेटर एक ऑपरेटर है जिसे कक्षाओं द्वारा ओवरलोड किया जा सकता है, लेकिन आमतौर पर पहचान व्यवहार होता है।

संदर्भ प्रकार जहां == अतिभारित नहीं किया गया है के लिए, यह तुलना चाहे दो संदर्भों में एक ही वस्तु को देखें - जो वास्तव में क्या बराबर की कार्यान्वयन System.Object में करता है।

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

+0

धन्यवाद। मैंने आपका जवाब स्वीकार कर लिया, लेकिन क्या आप कुछ चीजों में संपादित कर सकते हैं जोएल ने कहा? कैसे == व्यवहार करता है अगर overriden नहीं है। – Tigraine

+0

@ टाइगर: कोई समस्या नहीं। असल में जोएल ने जो कहा है (और एक अच्छा सौदा) जो मैंने लिंक किया है, जो जॉन स्कीट द्वारा लिखे गए पृष्ठ में उल्लिखित है। यदि आप चाहें तो मैं उद्धृत करूंगा। – Noldorin

+0

धन्यवाद .. :) इस तरह पढ़ने के लिए बस इतना आसान है;) – Tigraine

2

यदि आप इसे अधिभारित नहीं करते हैं, तो == केवल संदर्भ समानता की जांच करता है: क्या दोनों पक्ष एक ही ऑब्जेक्ट को संदर्भित करते हैं?

यदि आपको मूल्य समानता की आवश्यकता है (दोनों पक्षों पर अलग-अलग ऑब्जेक्ट्स एक ही मान हैं?), तो आप ऑपरेटर को अधिभारित कर सकते हैं। इस बिंदु पर, आप लगभग हमेशा अधिभार() और .GetHashCode() को अधिभारित करना चाहते हैं और बस आपके == अधिभार कॉल .quals()।

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