0

遵循覆盖 Equals() 和运算符 == 的指南(C# 编程指南),在覆盖 equals(object) 和 equals(type) 时覆盖 gethashcode 似乎是可取的。

据我了解,关于什么是覆盖 Equals 的最佳实现存在无休止的讨论。但是,我仍然希望更好地理解 Equals 概念并自行决定。

我的问题可能有点无聊,但我们开始吧:

  • Equals(object) 和 Equals(type) (独立于给定参数)之间的主要区别是什么?

据我了解(我可能完全错了,所以这同时是一个问题)

Equals(object) 是一种内置方法,它(默认情况下)查看对象引用是否相同。Equals(Type) 是您创建的本地方法。所以事实上,你在那个类中拥有的是带有 2 个重载的 Equals 方法。

  • 为什么他们要两次检查财产平等?

等于(对象)

   return base.Equals(obj) && z == p.z;

并在equals(type)中:

   return base.Equals((TwoDPoint)p) && z == p.z;
  • 为什么建议实现 Equals(type) 方法?

  • 我的大部分问题都在我在问题 1 中的陈述中被说唱。所以请注意任何错误或误导性的论点。另外,请随时添加任何信息,它肯定会有所帮助。

提前致谢

4

2 回答 2

2

首先让我们区分这两种方法

object.Equals()是根上的一个方法,object它被标记为virtual,因此可以在派生类中被覆盖。

IEquatable<T>.Equals是通过实现IEquatable<T>接口得到的方法。

后者用于确定泛型集合内的相等性;所以说文档:

IEquatable<T> 接口由 Dictionary<TKey、TValue>、List<T> 和 LinkedList<T> 等泛型集合对象在 Contains、IndexOf、LastIndexOf 和 Remove 等方法中测试相等性时使用。应该为可能存储在通用集合中的任何对象实现它。

前者用于确定其他地方的平等。

因此,在基础工作到位的情况下,让我们尝试回答您的一些具体问题

Equals(object) 和 Equals(type) 之间的主要区别是什么(独立于给定参数)?

一个对任何类型进行操作,另一个比较相同类型的实例

为什么他们要两次检查财产平等?

他们没有,通常只使用一个。然而,一个实现经常在内部调用另一个实现

为什么建议实现 Equals(type) 方法?

答案在上面 - 如果您打算将对象存储在通用集合中

附带说明一下,这可能有助于您理解这一点,相等检查的默认行为是检查引用是否相同(即,一个对象与另一个对象完全相同)。经常覆盖/实现不同的相等逻辑用于比较对象字段中的某些数据(类似于您的示例z == p.z

于 2013-03-14T12:49:35.987 回答
0

重载之间的一个区别是,如前所述,一个将在将对象与编译时已知为同一类型的事物进行比较时调用,而另一个将在所有其他情况下调用。另一个没有提到的非常重要的区别是,它Equals(ownType)不仅作用于 的事物ownType,而且作用于隐含可转换为 的事物ownType。因此,Equals不能期望在可转换类型的对象之间实现等价关系,除非强制其操作数为 type Object。例如,考虑

(12.0).Equals(12);

将整数值 12 转换为Double值 12.0。由于传递的值的类型和值与被调用12.0的方法精确匹配,因此返回.Equalstrue

(12).Equals(12.0);

Because Double is not implicitly convertible to Int32, passes the Double value as Object instead. Since the Double does not match the type of the 12 whose Equals method is being invoked, the method returns false.

The virtual method Equals(Object) implements an equivalence relation; in many cases involving implicit type conversions, the type-specific methods cannot be expected to do so.

于 2013-09-28T22:22:42.960 回答