我在以下代码段
中总结了我的问题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);
}
}
我只是想知道。这些实现之间有什么区别吗?
答案 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