gpt4 book ai didi

c# - 覆盖 GetHashCode()

转载 作者:IT王子 更新时间:2023-10-29 04:39:04 24 4
gpt4 key购买 nike

this article , Jon Skeet 提到他通常使用这种算法来覆盖 GetHashCode()

public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + Id.GetHashCode();
return hash;
}
}

现在,我已经尝试使用它,但 Resharper 告诉我方法 GetHashCode() 应该只使用只读字段进行哈希处理(尽管它编译得很好)。什么是好的做法,因为现在我真的不能让我的字段只读?

我尝试通过 Resharper 生成此方法,这是结果。

public override int GetHashCode()
{
return base.GetHashCode();
}

老实说,这并没有太大贡献......

最佳答案

如果您的所有字段都是可变的并且您必须实现 GetHashCode 方法,恐怕这就是您需要的实现。

public override int GetHashCode() 
{
return 1;
}

是的,这是低效的,但至少是正确的。

问题是 Dictionary 和 HashSet 集合使用 GetHashCode 将每个项目放入桶中。如果hashcode是根据一些可变的字段计算出来的,当对象被放入HashSet或Dictionary后字段真的发生了变化,那么这个对象就再也无法从HashSet或Dictionary中找到了。

请注意,所有对象都返回相同的 HashCode 1,这基本上意味着所有对象都被放入 HashSet 或 Dictionary 中的同一个桶中。因此,HashSet 或 Dictionary 中始终只有一个桶。尝试查找对象时,它将对唯一存储桶内的每个对象进行相等性检查。这就像在链表中进行搜索。

有人可能会争辩说,如果我们可以确保在将对象添加到 HashCode 或 Dictionary 集合后字段永远不会更改,那么基于可变字段实现哈希码就可以了。我个人的看法是这样容易出错。两年后接管您的代码的人可能没有意识到这一点并意外地破坏了代码。

关于c# - 覆盖 GetHashCode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11481323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com