必须使用C#Explicit Equality运算符实现

时间:2009-10-02 13:32:10

标签: c#

我明白为我的对象显式实现了Equals和GetHashCode。

但我想知道如果明确地实现这样的==和!=运算符是否有意义:

public static bool operator ==(Salutation left, Salutation right)
{
    return Equals(left, right);
}

调用==时C#不会自动使用Equals方法吗?

2 个答案:

答案 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()。