为什么default == implementation不能调用Equals?

时间:2012-04-11 16:08:04

标签: c# java .net

  

可能重复:
  Why ReferenceEquals and == operator behave different from Equals

==运算符的默认实现通过引用比较对象。因此,当您重写Equals(默认行为相同)时,您还必须指定==!=运算符,以便它们调用Equals(并在==的每个层次结构中生成它并且!=运算符不是虚拟的。)

我的问题是为什么会这样?为什么==!=通过引用比较对象而不是使用Equals?我想应该有这样一个基本的原因。

更新

评论:我假设==应该依赖于Equals(但反之亦然),因为您可以在基类中重写Equals并自动在派生类中使用此实现。如果Equals在其实现中使用==,那么它将无效,因为==不是虚拟的。

6 个答案:

答案 0 :(得分:9)

我认为主要原因是==是一个静态运算符,可以在null个对象上调用Equals 需要一个实例

例如:

Foo foo1 = null;
Foo foo2 = null;

Console.WriteLine(foo1 == foo2); // cannot use Equals

答案 1 :(得分:5)

Object.ReferenceEquals是一个static成员,用于比较引用的相等性。甚至值类型在传递给该方法之前都被装箱。

Equals怎么样,它是virtual方法,这意味着它允许消费者覆盖一个功能。

因此==行为的默认实现假定默认比较(引用)对您来说没问题,如果您需要特定的东西,在这种情况下框架为您提供virtual方法,可以被覆盖。

答案 2 :(得分:2)

“原因”是因为有时人们需要知道A 是否与B相同的实例而不是它们是否只是彼此“相等”。

例如,两个对象彼此相同可能对大多数业务逻辑有意义,但是,您可能还需要使用一些并发实用程序来执行原子操作,其中结果依赖于对象标识,而不是相等。

答案 3 :(得分:1)

自从C开始,它已经被用于引用,并且它被集成到语言语法中,而不是必须回复方法调用(即使两者的结果相同)。

简单地说,因为C#不是目标C:)

答案 4 :(得分:0)

在Java中,通过简单地比较引用来快速确定两个标识符是否相等有时会很好。 ==有它的位置。如果你看一下IDE生成的equals方法,你会经常发现第一次比较是参考相等,毕竟,如果对象引用是相同的,为什么要检查字段?

答案 5 :(得分:0)

我称之为功能。通过引用,两个相同的对象仍然是两个单独的对象如果重写等于,则可以确定两个对象是否相同。即使两个对象相同,我也可能想测试它们是否是同一个对象。我经常有理由重写equals,但从来没有需要覆盖==!=(但该语言提供了该选项)。

使用字符串覆盖==我不喜欢它。虽然string是引用类型,但是定义了相等运算符(==和!=)来比较字符串对象的值,而不是引用(7.9.7字符串相等运算符)。这使得对字符串相等性的测试更加直观。看看这个介绍的问题。 WPF ListBox Scroll to the bottom

相关问题