2012-08-29 36 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); 
    } 
} 

上述结构是自ValueType其中包含的GetHashCode方法的。下面是一个派生自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

是;值类型(struct s)默认将它们的散列码作为其字段值的组合。您可以通过以下方式观察这一点:

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并感谢详细的解释:) –

相关问题