据我所知,方法“ GetHashCode()”应仅使用只读/不可变属性。但是,如果我更改了例如使用GetHashCode()的id属性,则会得到新的哈希码。那么为什么它应该是不变的呢?如果它不会改变,那么我会看到问题,但是会改变。
class Program
{
public class Point
{
public int Id { get; set; }
public override bool Equals(object obj)
{
return obj is Point point &&
Id == point.Id;
}
public override int GetHashCode()
{
return HashCode.Combine(Id);
}
}
static void Main(string[] args)
{
Point point = new Point();
point.Id = 5;
var r1 = point.GetHashCode(); //467047723
point.Id = 10;
var r2 = point.GetHashCode(); //1141379410
}
}
答案 0 :(得分:2)
正因为如此,因为如果不是不可变的,则哈希码每次都会更改
哈希码是用于标识对象的数值 在平等测试中。它也可以用作对象的索引 在一个集合中。
因此,如果每次更改它,您都无法将其用于其目的。 more info...
答案 1 :(得分:2)
那里有GetHashCode()的主要原因是:从哈希表中检索对象。没错,希望仅从不可变字段计算哈希码,但是请考虑这样做的原因。由于哈希码用于从哈希表中检索对象,因此当哈希码在对象存储在哈希表中时更改时,将导致错误。
更笼统地说:GetHashCode返回的值必须保持稳定,只要结构依赖于该哈希码即可保持稳定。因此,以您为例,这意味着您可以更改id字段,只要该对象当前未在任何此类结构中使用即可。