GetHashCode()-不可变的值?

时间:2019-05-12 08:31:07

标签: c#

据我所知,方法“ 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
    }
}

2 个答案:

答案 0 :(得分:2)

正因为如此,因为如果不是不可变的,则哈希码每次都会更改

  

哈希码是用于标识对象的数值   在平等测试中。它也可以用作对象的索引   在一个集合中。

因此,如果每次更改它,您都无法将其用于其目的。 more info...

答案 1 :(得分:2)

那里有GetHashCode()的主要原因是:从哈希表中检索对象。没错,希望仅从不可变字段计算哈希码,但是请考虑这样做的原因。由于哈希码用于从哈希表中检索对象,因此当哈希码在对象存储在哈希表中时更改时,将导致错误。

更笼统地说:GetHashCode返回的值必须保持稳定,只要结构依赖于该哈希码即可保持稳定。因此,以您为例,这意味着您可以更改id字段,只要该对象当前未在任何此类结构中使用即可。