[英]GetHashCode() - immutable values?
據我所知,方法“ 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
}
}
正因為如此,因為如果它不是不可變的,則哈希碼每次都會更改
哈希碼是一個數值,用於在相等性測試期間標識對象。 它也可以用作集合中對象的索引。
因此,如果每次都更改它,您將無法將其用於其目的。 更多信息...
出現GetHashCode()的主要原因主要是:從哈希表中檢索對象。 沒錯,希望僅從不可變字段計算哈希碼,但是請考慮這樣做的原因。 由於哈希碼用於從哈希表中檢索對象,因此當哈希碼更改而對象存儲在哈希表中時,它將導致錯誤。
概括地說:GetHashCode返回的值必須保持穩定,只要結構依賴於該哈希碼即可保持穩定。 因此,以您為例,這意味着您可以更改id字段,只要該對象當前未在任何此類結構中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.