在Object和ValueType类中实现的GetHashCode有什么区别?

时间:2012-08-29 09:56:29

标签: c#

我在以下代码段

中总结了我的问题
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是从包含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);
    }
}

我只是想知道。这些实现之间有什么区别吗?

1 个答案:

答案 0 :(得分:6)

是;默认情况下,value-types(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