只是想让某人确认我的想法,我在 Foo 类中尝试了覆盖等于和 GetHashCode 的不同组合:
class Foo
{
static int n;
public override bool Equals(object obj)
{
return true;
//return false;
}
public override int GetHashCode()
{
return 0;
//return n++;
}
}
然后测试结果显示:
static void Main(string[] args)
{
HashSet<Foo> set = new HashSet<Foo>();
Foo f1 = new Foo();
Foo f2 = new Foo();
Console.WriteLine(f1.Equals(f2));
set.Add(f1);
Console.WriteLine(set.Contains(f2));
Console.ReadLine();
}
所以包含由Equals决定,然后由GetHashCode决定,我是对的吗?
答案 0 :(得分:7)
其他方式。首先调用GetHashCode()
。这用于给出一个哈希码(因此得名),用于确定对象应该存储在何处。
无法保证哈希码将是唯一的(此外,它会进一步减少),因此可能存在多个以相同哈希存储的对象(性能越多,性能越差,但这是另一回事)。因此,在找到可能的匹配后,Equals
用于确认匹配。
因此,Contains
首先取决于GetHashCode()
,然后取决于Equals()
。
两者协同工作是为什么你必须总是覆盖一个,如果你覆盖另一个,并且总是覆盖你的GetHashCode()
,以便任何两个彼此考虑的对象Equal()
将有相同的代码。