据我所知,"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
}
}发布于 2019-05-12 08:40:08
GetHashCode()的存在主要有一个原因:从哈希表检索对象。您正确地认为,应该只从不可变字段计算哈希代码,但请考虑原因。由于哈希代码用于从哈希表中检索对象,因此当哈希代码被存储在哈希表中时,当哈希代码发生更改时,将导致错误。
换句话说,GetHashCode返回的值必须保持稳定,只要结构依赖于该哈希代码才能保持稳定。因此,对于您来说,这意味着您可以更改id字段,只要对象当前没有在任何这样的结构中使用。
发布于 2019-05-12 08:39:42
正是因为这一点,因为如果它不是不变的,则哈希代码每次都会更改。
哈希代码是一个数值,用于在等式测试期间标识对象。它还可以作为集合中的对象的索引。
所以如果它每次都变了,你就不能用它来达到它的目的。更多信息..。
https://stackoverflow.com/questions/56097455
复制相似问题