只是想让某人确认我的想法,我在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++; } }
然后测试结果显示:
static void Main(string[] args) { HashSetset = new HashSet (); Foo f1 = new Foo(); Foo f2 = new Foo(); Console.WriteLine(f1.Equals(f2)); set.Add(f1); Console.WriteLine(set.Contains(f2)); Console.ReadLine(); }
当Equals为true时,Contains由GetHashCode确定;
当Equals为false时,Contains始终为false.
所以Contains由Equals决定,然后由GetHashCode决定,对吗?
其他方式.首先GetHashCode()
叫.这用于给出哈希码(因此名称),用于确定对象应存储在何处.
不能保证哈希码是唯一的(此外,它会进一步减少),因此可能存在多个以相同哈希存储的对象(性能越多,性能越差,但这是另一回事).因此,在找到可能的匹配后Equals
,用于确认匹配.
所以首先Contains
取决于GetHashCode()
,然后取决于Equals()
.
两者协同工作是为什么你必须总是覆盖一个,如果你覆盖另一个,并总是覆盖你GetHashCode()
的方式,任何两个相互考虑的对象Equal()
将具有相同的代码.