首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetHashCode() -不变值?

GetHashCode() -不变值?
EN

Stack Overflow用户
提问于 2019-05-12 08:31:07
回答 2查看 492关注 0票数 0

据我所知,"GetHashCode()“方法应该只使用只读/不可变属性。但是,如果我更改例如使用GetHashCode()的id属性,则会得到新的哈希代码。那么为什么它应该是不变的呢?如果它不改变,那么我看到了问题,但它改变了。

代码语言:javascript
复制
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
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-12 08:40:08

GetHashCode()的存在主要有一个原因:从哈希表检索对象。您正确地认为,应该只从不可变字段计算哈希代码,但请考虑原因。由于哈希代码用于从哈希表中检索对象,因此当哈希代码被存储在哈希表中时,当哈希代码发生更改时,将导致错误。

换句话说,GetHashCode返回的值必须保持稳定,只要结构依赖于该哈希代码才能保持稳定。因此,对于您来说,这意味着您可以更改id字段,只要对象当前没有在任何这样的结构中使用。

票数 2
EN

Stack Overflow用户

发布于 2019-05-12 08:39:42

正是因为这一点,因为如果它不是不变的,则哈希代码每次都会更改。

哈希代码是一个数值,用于在等式测试期间标识对象。它还可以作为集合中的对象的索引。

所以如果它每次都变了,你就不能用它来达到它的目的。更多信息..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56097455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档