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

本文关键字:GetHashCode 什么 区别 实现 Object ValueType | 更新日期: 2025-02-19 10:15:59

我在下面的代码片段中总结了我的问题

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

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

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

是;默认情况下,值类型(structs)将其哈希代码作为其字段值的组合。你可以通过尝试来观察这一点:

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