【发布时间】:2012-07-13 22:39:15
【问题描述】:
在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();
}
说实话,这并没有多大贡献......
【问题讨论】:
-
@Ria 在这个问题中没有人谈论只读字段。
-
您可以参考 Eric Lippert 博客上的 this article。特别要注意“规则:当对象包含在依赖于哈希码保持稳定的数据结构中时,GetHashCode 返回的整数绝不能更改”部分。他写道:“虽然很危险,但允许一个对象的哈希码值随着对象的字段发生变异而发生变异。”
标签: c# hash resharper gethashcode