我明白为我的对象显式实现了Equals和GetHashCode。
但我想知道如果明确地实现这样的==和!=运算符是否有意义:
public static bool operator ==(Salutation left, Salutation right)
{
return Equals(left, right);
}
调用==时C#不会自动使用Equals方法吗?
答案 0 :(得分:8)
与Equals
一起覆盖等于运算符确实有意义。事实上,这是非常明智的。
微软已在MSDN上发布官方Guidelines for Implementing Equals and the Equality Operator (==)。我肯定会去那里推荐的做法。两个要点是:
- 每当实现Equals时都实现GetHashCode方法 方法。这保持等于和 GetHashCode已同步。
- 每当实现相等运算符时,都会覆盖Equals方法 (==),让他们做同样的事情。 这允许基础设施代码 作为Hashtable和ArrayList,使用 等于方法,表现相同 用户代码编写的方式 平等操作员。
Jon Skeet还撰写了关于该主题的useful MSDN blog post,总结了Equals
和==
运算符默认在参考/值类型上的工作方式。
以下引用最重要的部分:
Equals方法只是一个虚拟方法 一个在System.Object中定义的,和 被任何一个班级选择覆盖 这样做。 ==运算符是一个 可以超载的运算符 课程,但通常有 身份行为。
对于==没有的参考类型 超载,它比较是否 两个参考文献指的是相同的 对象 - 这正是什么 Equals的实施确实在 System.Object的。
值类型不提供重载 对于==默认情况下。但是,大多数 由...提供的值类型 框架提供了自己的超载。 Equals的默认实现 对于值类型,由。提供 ValueType,并使用反射来制作 比较,这使得它 明显比a慢 通常类型特定的实现 将会。这个实现也 调用成对的引用等于 在被比较的两个值中。
答案 1 :(得分:2)
如果你不重载它,==只检查引用相等:双方是否引用同一个对象?
如果需要值相等(两边的不同对象是否具有相同的值?),则可以使运算符重载。此时,您几乎总是想要重载.Equals()和.GetHashCode(),并且只有你的==重载调用.Equals()。