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

标签 c# .net equals equality iequatable

我想要我的 Food类能够在它等于 Food 的另一个实例时进行测试.稍后我会将它用于列表,我想使用它的 List.Contains()方法。我应该实现 IEquatable<Food> 吗?或者只是重写 Object.Equals() ?来自 MSDN:

This method determines equality by using the default equality comparer, as defined by the object's implementation of the IEquatable.Equals method for T (the type of values in the list).

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

最佳答案

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

引用类型的好处不多,但 IEquatable<T>实现确实让你避免来自 System.Object 的转换如果经常调用它会有所作为。

Jared Parson's blog 所述不过,您必须仍然执行标准Object.EqualsObject.GetHashcode覆盖。

关于c# - IEquatable 和仅覆盖 Object.Equals() 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2734914/

相关文章:

C# 如何在不改变原文件名的情况下复制文件

c# - 四舍五入到最近的年份

c# - CosmosDb 使用 insertMany 请求率很大

java - 如何继续在数组上提供方法,直到它等于其他数组

java - 如何在Java中正确实现equals

Java - 是否有像 instanceof 这样的 "subclassof"?

C#:测试一个对象是否实现了接口(interface)列表中的任何一个?

c# - 如何使用 .NET P/调用 CryptUIWizExport 函数

c# - .Net SDK问题,该何去何从?

c# - 有条件地显示/隐藏 Windows 表单元素