小编典典

IEquatable 和仅覆盖 Object.Equals() 之间有什么区别?

all

我希望我的Food类能够在它等于另一个实例时进行测试Food。稍后我将对列表使用它,并且我想使用它的List.Contains()方法。我应该实施IEquatable<Food>还是只是覆盖Object.Equals()?来自
MSDN:

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

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


阅读 70

收藏
2022-06-16

共1个答案

小编典典

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

引用类型没有那么大的好处,但是IEquatable<T>实现确实可以让您避免强制转换,System.Object如果频繁调用它会产生影响。

2022-06-16