繁体   English   中英

为什么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)将抛出NullReferenceException ,而Object.Equals(x.Name, y.Name)将执行有效比较

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

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

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

阅读有关Object.EqualsString.Equals的更多说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM