簡體   English   中英

GetHashCode()-不可變的值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM