繁体   English   中英

C#用户类。 GetHashCode实现

[英]C# User class. GetHashCode implementation

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

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!
    }
}

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

如果我所有的属性都是可变的,我该如何在GetHashCode()生成正确的哈希。

GetHashCode合同要求(强调我的):

只要没有修改确定对象的Equals方法返回值的对象状态,对象的GetHashCode方法就必须始终返回相同的哈希码。

因此,基本上,您应该根据Equals所有使用的字段进行计算,即使它们是可变的。 但是,文档还指出:

如果确实选择为可变的引用类型覆盖GetHashCode ,则文档应明确说明,当对象存储在哈希表中时,该类型的用户不应修改对象值。

如果只有部分属性是可变的,则可以覆盖GetHashCode以仅基于不可变的属性进行计算-但是在这种情况下, 所有内容都是可变的,因此您最终将返回一个常量,使它变得难以处理基于哈希的集合。

因此,我建议以下三个选项之一:

  • 使用可变字段,并仔细记录下来。
  • 放弃覆盖平等/哈希操作
  • 放弃它的可变性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM