为什么默认 == 实现不调用 Equals?

2022-09-01 17:46:07

可能的重复:
为什么 ReferenceEquals 和 == 运算符的行为与 Equals 不同

运算符的默认实现按引用比较对象。因此,当您覆盖 Equals(其默认行为相同)时,还必须指定和运算符,以便它们调用 Equals(并在每类层次结构中将其设置为和运算符不是虚拟的)。====!===!=

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

更新。

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


答案 1

我相信主要原因是一个静态运算符,可以在对象上调用,而需要一个实例==nullEquals

例如:

Foo foo1 = null;
Foo foo2 = null;

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

答案 2

Object.ReferenceEquals 是比较引用相等性的成员。甚至值类型在传递到该方法之前也会被装箱。static

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

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


推荐