2009-10-06 16 views
6

== ऑपरेटर को लागू करते समय, मुझे लगता है कि मुझे कुछ आवश्यक अंक याद आ रहे हैं।
इसलिए, मैं इसके आसपास कुछ सर्वोत्तम प्रथाओं को खोज रहा हूं।सी # में कक्षा के लिए == ऑपरेटर को लागू करने के लिए सर्वोत्तम प्रथाएं क्या हैं?

  • कैसे सफाई से संदर्भ तुलना को संभालने के लिए:
    यहाँ कुछ संबंधित प्रश्नों के बारे में मैं सोच रहा हूँ कर रहे हैं?
  • इसे IEquatable<T> के माध्यम से इंटरफ़ेस के माध्यम से कार्यान्वित किया जाना चाहिए? या object.Equals ओवरराइडिंग?
  • और != ऑपरेटर के बारे में क्या?

(यह सूची संपूर्ण नहीं हो सकती है)।

+3

इन धागे की जांच करें: http://stackoverflow.com/questions/962960/equals-method-implementation-helpers-c, http://stackoverflow.com/questions/1421289/icomparable-and-equals, http://stackoverflow.com/questions/660566/override-equals-and-gethashcode-question, http://stackoverflow.com/questions/567642/how-to-best-implement-equals-for- कस्टम-types – Groo

उत्तर

11

मैं माइक्रोसॉफ्ट के Guidelines for Overloading Equals() and Operator == का पालन करता हूं।

संपादित:

गैर अपरिवर्तनीय प्रकार में अधिभावी ऑपरेटर == अनुशंसित नहीं है: माइक्रोसॉफ्ट के दिशा निर्देशों के इस महत्वपूर्ण टिप्पणी है, जो हेंक के जवाब की पुष्टि करने लगता है होते हैं।

3
  • आप == लागू करते हैं तो .Equals और ओवरराइड। GetHashCode
  • लागू! = साथ ही
  • object.ReferenceEquals का उपयोग कर अशक्त संदर्भ के लिए
  • चेक अन्यथा ऑपरेटर recurse होगा
+2

दरअसल, आप लागू करने के लिए है! = साथ ही, अन्यथा सी # आपको संकलित करने नहीं देगा। –

+0

अच्छा बिंदु। भूल गए – dkackman

4

हर बार जब आप == ऑपरेटर लागू, यह भी !=, IEquatable<T> लागू करने के लिए सुनिश्चित हो और ओवरराइड करने के लिए Object.Equals() और Object.GetHashCode() आपकी कक्षा के उपयोगकर्ता के लिए स्थिरता के लिए।

public bool Equals(MyClass other) { 
     if (ReferenceEquals(other, null)) 
      return false; 
     if (ReferenceEquals(other, this)) 
      return true; 
     return // your equality code here 
    } 

    public override bool Equals(object obj) { 
     return Equals(obj as MyClass); 
    } 

    public override int GetHashCode() { 
     return // your hash function here 
    } 

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

    public static bool operator !=(MyClass left, MyClass right) { 
     return !(left == right); 
    } 
+0

यह। साथ ही, यदि आप शुरुआत में <(कम से कम) ऑपरेटर को लागू करते हैं, तो आप प्रत्येक ऑपरेटर को लागू करने के लिए अकेले उस ऑपरेटर का उपयोग कर सकते हैं। यानी: == को व्यक्त किया जा सकता है! (बाएं <दाएं || दाएं <बाएं) यदि <ऑपरेटर पहले ही लागू हो चुका है। –

4

सबसे आम तरीका है नहीं इसे संभाल करने के लिए है:

एक वर्ग को ध्यान में रखते, यहाँ मेरे सामान्य कार्यान्वयन है। डिफ़ॉल्ट संदर्भ तुलना है जो आम तौर पर कक्षा वस्तुओं के लिए सही है।

तो सबसे पहले आप यह सुनिश्चित करना चाहते हैं कि आपको मूल्य-प्रकार व्यवहार की आवश्यकता है।

+2

प्रश्न के स्पष्ट उत्तर दें, फिर किसी को बताए कि वे चीजों को बदलने के तरीके को बदलने की सलाह दें। –

0

ऐसे कार्यों के लिए Resharper का उपयोग करें। पहिया को पुनर्निर्मित करने में कोई बात नहीं है।

+1

यह एक छोटा सा काम – spender

+1

के लिए एक महंगा समाधान है, इसके अलावा, कुछ कार्यों के लिए, इस तरह, मैं इतना चाहता हूं कि एक डेवलपर * कुछ उपकरण ठीक से कैसे करना है * कुछ उपकरण उसके लिए काम करने के बजाय, और कभी नहीं इसके बारे में फिर से सोचा। –

+0

@ स्पेंडर मुझे यकीन है कि आप जानते हैं कि आर # न केवल ऐसे छोटे कार्यों के लिए उपयोग किया जा सकता है। @ माइक वे इसे हाथ से लिखने में सक्षम होना चाहिए, लेकिन उनके पास उपकरण भी अधिक उत्पादक होने चाहिए और इसे लिखना नहीं है। –

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

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