一尘不染

IEquatable和仅重写Object.Equals()有什么区别?

c#

我希望我的Food课程能够在等于的另一个实例时进行测试Food。稍后将针对列表使用它,并且我想使用其List.Contains()方法。我应该实施IEquatable<Food>还是仅重写Object.Equals()?从MSDN:

此方法通过使用默认的相等比较器来确定相等,该比较器由对象的IEquatable.Equals方法实现,用于T(列表中值的类型)。

所以我的下一个问题是:.NET框架的哪些函数/类使用了Object.Equals()?我应该首先使用它吗?


阅读 374

收藏
2020-05-19

共1个答案

一尘不染

主要原因是性能。当泛型在.NET
2.0中引入他们能够添加一堆整齐班如List<T>Dictionary<K,V>HashSet<T>,等这些结构大量使用GetHashCodeEquals。但是对于值类型,这需要装箱。IEquatable<T>使结构实现强类型Equals方法,因此不需要装箱。因此,在将值类型与泛型集合一起使用时,性能会更好。

引用类型不会带来太多好处,但是该IEquatable<T>实现确实使您避免了强制转换,System.Object如果频繁调用强制转换会有所不同。

正如Jared Parson的博客所述,您仍然必须实现Object覆盖。

2020-05-19