为什么 Object.Equals 优于从实例调用 String.Equals?

Why is Object.Equals preferred to calling String.Equals from an instance?

我正在准备 C# 认证并面临以下问题(为简单起见编辑了代码):

class Class
{
    public string Name { get; set; } = "hello";
}

...

Class a = new Class();
Class b = new Class();
Class c = a;

Assert.IsTrue(a.Name == b.Name);
Assert.IsTrue(a.Name.Equals(b.Name));
Assert.IsTrue(Object.Equals(a.Name, b.Name));

Assert.IsTrue(a.Name == c.Name);
Assert.IsTrue(a.Name.Equals(c.Name));
Assert.IsTrue(Object.Equals(a.Name, c.Name));

Assert.IsTrue(a.Name == a.Name);
Assert.IsTrue(a.Name.Equals(a.Name));
Assert.IsTrue(Object.Equals(a.Name, a.Name));

所有这些断言都通过了。

认证测试转储表明 Object.Equals(*.Name, *.Name) 是正确答案,*.Name.Equals(*.Name) 是错误答案。

为什么?

因为如果 x.Namenullx.Name.Equals(y.Name) 将抛出 NullReferenceExceptionObject.Equals(x.Name, y.Name) 将执行有效比较

Object.Equals 首先比较对象引用,然后调用 String.Equals 进行进一步的相等性检查。

String.Equals 测试字符串是否相等。它通过方法名称 Equals 或等于运算符调用。

Object.Equals比较对象的内容。它首先检查引用是否相等,object.ReferenceEquals 也是如此。但随后它会调用派生的 Equals 方法来进一步测试相等性。

阅读有关 Object.Equals and String.Equals

的更多说明