我只有公共字符串属性的简单类.
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()如果我的所有属性都是可变的,我怎样才能生成正确的哈希值.
该合同GetHashCode要求(重点煤矿):
的
GetHashCode用于一个对象的方法必须一致地返回相同的散列码,只要没有修改确定的该对象的Equals方法返回值的对象的状态.
所以基本上,你应该根据所有使用的字段计算它Equals,即使它们是可变的.但是,文档还指出:
如果您确实选择覆盖
GetHashCode可变引用类型,那么您的文档应该清楚地表明,当对象存储在哈希表中时,您的类型的用户不应修改对象值.
如果只有一些属性是可变的,你可能会覆盖GetHashCode只根据不可变属性来计算它 - 但在这种情况下,一切都是可变的,所以你基本上最终会返回一个常量,这使得它很难在哈希中基于集合.
所以我建议三种选择之一:
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |