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

san*_*ngh 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 6

是; struct默认情况下,value-types 将其哈希码作为其字段值的组合.您可以尝试通过以下方式观察:

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
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)