[英]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.