在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);
}
}
我只是想知道。这些实现之间有什么区别吗?
是;默认情况下,值类型(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