2010-09-07 20 views
6

मैं समझने की कोशिश कर रहा हूं कि object.GetHashCode() का उपयोग किस लिए किया जाता है। मैंने पढ़ा है कि संग्रहों द्वारा विशिष्ट रूप से कुंजी की पहचान करने के लिए इसका उपयोग किया जाता है। लेकिन मैं इसका परीक्षण करना चाहता था और नतीजा यह नहीं था कि मुझे क्या उम्मीद थी।GetHashCode() क्यों मायने रखता है?

struct Animal 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public Animal(string name, int age) : this() 
    { 
     Name = name; 
     Age = age; 
    } 

    public override int GetHashCode() 
    { 
     return Age.GetHashCode(); 
    } 
} 

object doggy = new Animal("Dog", 25); 
object cat = new Animal("Cat", 25); 

Hashtable table = new Hashtable(); 
table.Add(doggy, "Dog"); 
table.Add(cat, "Cat"); 

Console.WriteLine("{0}", table[cat]); 
Console.WriteLine("{0}", table[doggy]); 

मैं अधिलेखित कर देगा "डॉग" "कैट" या मुझे बता कि "कुंजी पहले से मौजूद" लेकिन उत्पादन

"कैट" "डॉग" है त्रुटि के कुछ प्रकार की उम्मीद है |

+3

बीटीडब्ल्यू - यह सवाल से संबंधित नहीं है, लेकिन इस परिदृश्य के लिए 'स्ट्रक्चर' बहुत खराब विकल्प है। यदि संदेह है, तो 'वर्ग' का उपयोग करें। यदि संदेह में नहीं है, तो शायद अभी भी 'कक्षा' का उपयोग करें। यह * अत्यधिक * (वैध रूप से) सी # में 'संरचना' घोषित करने के लिए दुर्लभ है। –

+0

हाँ, मैं सहमत हूं, वास्तव में परीक्षण मूल रूप से कक्षा के साथ था, लेकिन मैंने यह देखने के लिए स्ट्रक्चर को बदलने की कोशिश की कि क्या यह अंतर भिन्न है :) –

उत्तर

12

GetHashCode केवल पहले जांच, गैर समानता और संभव समानता का निर्धारण किया जाता है। उसके बाद, बराबर की जांच की जाती है। ऑब्जेक्ट्स के लिए संदर्भ-समानता के लिए डिफ़ॉल्ट, और structs के लिए एक सदस्य की तुलना है। उचित कार्यान्वयन (हैश-कोड के साथ जोड़ा गया) देने के लिए Equals ओवरराइड करें, और इसे आपके द्वारा अपेक्षित परिणाम देना चाहिए (डुप्लिकेट कुंजी)।

btw, आईडीई शायद पहले से ही आपको एक चेतावनी दे रहा है कि GetHashCode और Equals हमेशा एक साथ व्यवहार किया जाना चाहिए ...

+0

एक अतिरिक्त के रूप में, एमएसडीएन कहता है: "गेटहाशकोड को ओवरराइड करने वाले व्युत्पन्न वर्गों को भी दो की गारंटी देने के लिए बराबर ओवरराइड करना होगा बराबर मानी जाने वाली वस्तुओं में एक ही हैश कोड होता है, अन्यथा, हैशटेबल प्रकार सही ढंग से काम नहीं कर सकता है। " http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx –

2

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

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