Lei*_*ang 2 .net c# dictionary hashset
只是想让某人确认我的想法,我在Foo类中尝试了重写Equals和GetHashCode的不同组合:
class Foo
{
static int n;
public override bool Equals(object obj)
{
return true;
//return false;
}
public override int GetHashCode()
{
return 0;
//return n++;
}
}
Run Code Online (Sandbox Code Playgroud)
然后测试结果显示:
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();
}
Run Code Online (Sandbox Code Playgroud)
所以Contains由Equals决定,然后由GetHashCode决定,对吗?
其他方式.首先GetHashCode()叫.这用于给出哈希码(因此名称),用于确定对象应存储在何处.
不能保证哈希码是唯一的(此外,它会进一步减少),因此可能存在多个以相同哈希存储的对象(性能越多,性能越差,但这是另一回事).因此,在找到可能的匹配后Equals,用于确认匹配.
所以首先Contains取决于GetHashCode(),然后取决于Equals().
两者协同工作是为什么你必须总是覆盖一个,如果你覆盖另一个,并总是覆盖你GetHashCode()的方式,任何两个相互考虑的对象Equal()将具有相同的代码.