2012-08-29 8 views
5

私は、構造体の上にコードスニペットObjectとValueTypeクラスで実装されたGetHashCodeの違いは何ですか?

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); 
    } 
} 

次の私の質問は、GetHashCodeメソッドが含まれているValueTypeから派生しまとめています。以下はObjectから派生し、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

はい。 value-types(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と詳細な説明に感謝:) –

関連する問題