C#用户类.GetHashCode实现

gek*_*k0n 0 c# gethashcode

我只有公共字符串属性的简单类.

public class SimpleClass
{
    public string Field1 {get; set;}
    public string Field2 {get; set;}
    public string Field3 {get; set;}
    public List<SimpleClass> Children {get; set;}

    public bool Equals(SimpleClass simple)
    {
        if (simple == null)
        {
            return false;
        }
        return IsFieldsAreEquals(simple) && IsChildrenAreEquals(simple);
    }

    public override int GetHashCode()
    {
        return RuntimeHelpers.GetHashCode(this); //Bad idea!
    }
}
Run Code Online (Sandbox Code Playgroud)

对于相等的实例,此代码不返回相同的值.但是这个类没有用于计算哈希的只读字段.

GetHashCode()如果我的所有属性都是可变的,我怎样才能生成正确的哈希值.

Jon*_*eet 7

合同GetHashCode要求(重点煤矿):

GetHashCode用于一个对象的方法必须一致地返回相同的散列码,只要没有修改确定的该对象的Equals方法返回值的对象的状态.

所以基本上,你应该根据所有使用的字段计算它Equals,即使它们是可变的.但是,文档还指出:

如果您确实选择覆盖GetHashCode可变引用类型,那么您的文档应该清楚地表明,当对象存储在哈希表中时,您的类型的用户不应修改对象值.

如果只有一些属性是可变的,你可能会覆盖GetHashCode只根据不可变属性来计算它 - 但在这种情况下,一切都是可变的,所以你基本上最终会返回一个常量,这使得它很难在哈希中基于集合.

所以我建议三种选择之一:

  • 使用可变字段,并仔细记录.
  • 放弃重写平等/散列操作
  • 放弃它是可变的