c# - 对象.等于 : everything is equal by default

标签 c# equals equality

在阅读 Jeffrey Richter 的 CLR via C# 4th edition 时(Microsoft Press),作者曾在某一时刻指出,虽然 Object.Equals 当前检查身份相等性,Microsoft should have implemented the method like this :

public class Object {
    public virtual Boolean Equals(Object obj) {
        // The given object to compare to can't be null
        if (obj == null) return false;

        // If objects are different types, they can't be equal.
        if (this.GetType() != obj.GetType()) return false;

        // If objects are same type, return true if all of their fields match
        // Because System.Object defines no fields, the fields match
        return true;
    }
}

这让我觉得很奇怪:默认情况下相同类型的每个非空对象都是相等的?因此,除非被覆盖:所有类型的实例都是相等的(例如,所有锁定对象都是相等的),并返回相同的哈希码。并假设 Object 上的 == 仍然检查引用相等性,这意味着 (a == b) != a.Equals(b) 这也很奇怪。

我认为,如果事物是​​完全相同的事物(身份),则事物平等的想法比仅仅使一切平等除非被覆盖更好。但这是微软出版的著名书籍的第 4 版,所以这个想法肯定有一些优点。我阅读了其余的文字,但忍不住想知道:为什么作者会这样建议?我在这里错过了什么?与当前的 Object.Equals 实现相比,Richter 的实现有何巨大优势?

最佳答案

当前默认的 Equals() 执行所谓的浅比较(或引用比较),然后如果引用不同则不再进一步检查。

我认为这是完全可以接受的基础实现。我当然不会认为它是错误的或不完整的。

您引用的

Richter 的示例1 对于基础 System.Object 也是完全合法的。他的实现的问题在于,可以说它应该被声明为 abstract2 - 使用他的方法,如果不重写,派生对象将得到不可靠的 Equals()它(因为 Equals() 应该进行深度比较)。必须在所有派生对象上重写此方法需要大量工作,因此 Microsoft 的方式作为默认方式更好。所以本质上你是对的:里希特的例子很奇怪——最好默认不等于而不是相反(如果人们忘记覆盖它,默认为 true 会导致一些相当有趣的行为).

(仅供引用,这里是书中公布的默认实现)

enter image description here



1:Richter 是一个聪明的人,他知道自己的东西,我一般不会反驳他说的任何话。您必须了解,MS 工程师将不得不对很多事情进行长时间和艰苦的思考,因为他们知道他们没有能力将其弄错然后稍后再修复。无论他们多么正确,人们总是会在以后再猜测他们,并提出不同的意见。这并不意味着原始版本是错误的或替代版本是错误的 - 它只是意味着有一个替代版本。

2:这当然意味着没有基础实现,这很好,因为它本来就不可靠。

关于c# - 对象.等于 : everything is equal by default,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720483/

相关文章:

java - 为了在集合中添加一个对象,是否有必要同时覆盖 equals 和 hashcode。?

java - .Contains() 方法不调用 Overridden equals 方法

c++ - 比较是否相等时可以使用 `==` 吗?

c# - 如何判断是否连接到互联网

c# - 跨不同 Controller 和 View 重用局部 View (ascx)

c# - Razor:方法 'Write' 没有重载需要 0 个参数

Java:实现用于比较两个 double[][] 数组的 equals 方法

java - 我应该重写 Object.equals(Object) 方法吗?

javascript - 对象和原始类型相等

c# - 策略模式对这种情况有帮助吗?