2012-08-29 9 views
5

मैं कोड निम्नलिखित में मेरे सवाल का संक्षेपण किया है झलकीऑब्जेक्ट और वैल्यू टाइप क्लास में गेटहाशकोड लागू करने के बीच क्या अंतर है?

struct Point 
{ 
    public int X; 
    public int Y; 

    public Point(int x, int y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 

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

    public void PrintValue() 
    { 
     Console.WriteLine(
      "{0},{1}", 
      this.X, this.Y); 
    } 
} 

struct ऊपर ValueType जो GetHashCode विधि शामिल से प्राप्त होता है। नीचे एक वर्ग संस्करण है जो ऑब्जेक्ट से प्राप्त होता है और इसमें GetHashCode विधि शामिल है।

class Point 
{ 
    public int X; 
    public int Y; 

    public Point(int x, int y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 

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

    public void PrintValue() 
    { 
     Console.WriteLine(
      "{0},{1}", 
      this.X, this.Y); 
    } 
} 

मैं बस जानना चाहता था। क्या इन कार्यान्वयन के बीच कोई अंतर है?

उत्तर

6

हां; मूल्य-प्रकार (struct एस) डिफ़ॉल्ट रूप से अपने हैश-कोड को अपने फ़ील्ड के मानों के समग्र के रूप में बनाते हैं। आप प्रयास करके इस का पालन कर सकते हैं:

var s = new Point(1,2); // struct 
Console.WriteLine(s.GetHashCode()); 
s.X = 22; // <=============== struct fields should usually be readonly! 
Console.WriteLine(s.GetHashCode()); // different 

ध्यान दें कि Equals समान नियमों का अनुसरण करता।

इसके विपरीत, एक संदर्भ-प्रकार (class), का उपयोग करता है डिफ़ॉल्ट रूप से, संदर्भ में हीGetHashCode() और Equals() दोनों के लिए। s.X = 22 होगा नहीं प्रभाव एक class:

var s = new Point(1,2); // class 
Console.WriteLine(s.GetHashCode()); 
s.X = 22; 
Console.WriteLine(s.GetHashCode()); // same 
+0

मार्क Gravell: +1 और विस्तृत विवरण के लिए धन्यवाद :) –

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