2012-01-25 18 views
45

मैं समुदाय से सुनना चाहता हूं कि मुझे अपने ऑब्जेक्ट के लिए GetHashCode (या इसे ओवरराइड करने) के बारे में कैसे जाना चाहिए। मैं समझता हूं कि अगर मैं बराबर विधि को ओवरराइड करता हूं तो मुझे ऐसा करने की ज़रूरत है। मैंने इसे उचित समय लागू किया है, कभी-कभी केवल बेस विधि को बुलाता है। मैं समझता हूं कि मेरे ऑब्जेक्ट को ऑब्जेक्ट के दूसरे उदाहरण के बराबर होना चाहिए यदि इसमें समान विवरण (सदस्य) हैं। कक्षा के सदस्यों से हैश कोड प्राप्त करने का सबसे अच्छा तरीका क्या है?GetHashCode को सही ढंग से कार्यान्वित करना

+2

http://stackoverflow.com/a/720282/93922 –

+2

के डुप्लिकेट के रूप में बंद करने पर विचार करें, ऐसा करने से पहले, मैं अनुशंसा करता हूं कि आप मेरे लेख को पढ़ और समझें: http://blogs.msdn.com/b /ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

+0

धन्यवाद, मैं समझता हूं कि यह एक आम प्रश्न हो सकता है और मुझे थोड़ा और शिकार करना चाहिए था। आपकी मदद के लिए धन्यवाद – Zivka

उत्तर

34

मान लें कि आपका वर्ग इस तरह दिखता है:

class Frob { 
    public string Foo { get; set; } 
    public int Bar { get; set; } 
    public double FooBar { get; set; } 
} 

की आप को परिभाषित के बराबर होती है मान लीजिए ताकि Frob के दो उदाहरणों के बराबर हैं यदि उनके Foo और उनके Bar बराबर हैं, लेकिन FooBar फर्क नहीं पड़ता।

तो आपको Foo और Bar के संदर्भ में GetHashCode परिभाषित करना चाहिए। एक तरीका इस तरह है:

return this.Foo.GetHashCode() * 17 + this.Bar.GetHashCode(); 

असल में, आप केवल समानता को परिभाषित करने वाले सभी क्षेत्रों को शामिल करना चाहते हैं। एक तरीका यह है कि मैंने 17 जैसे ही जमा किया है और गुणा करना है। यह तेज़ है, यह आसान है, यह सही है, और यह आमतौर पर एक अच्छा वितरण देता है।

+5

ओवरराइड करने की आवश्यकता नहीं है। मुझे लगता है कि यह एक सवाल होना चाहिए, लेकिन 23 क्यों? –

+1

{2,1} और {1,2} बनाने के लिए प्राइम कारक अलग-अलग हैं। –

+6

शायद इंगित करें कि GetHashCode केवल आपको बताता है कि क्या दो ऑब्जेक्ट ** ** बराबर माना जा सकता है। हैश टकराव की स्थिरता अभी भी है। – geofftnz

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