[英]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.Name
为null
则x.Name.Equals(y.Name)
将抛出NullReferenceException
,而Object.Equals(x.Name, y.Name)
将执行有效比较
Object.Equals
首先比较对象引用,然后调用String.Equals
进行进一步的相等性检查。
String.Equals
测试字符串是否相等。 使用方法名称Equals或相等运算符调用它。
Object.Equals
比较对象的内容。 它首先检查引用是否相等, object.ReferenceEquals
也是如此。 但是随后它调用派生的Equals方法来进一步测试相等性。
阅读有关Object.Equals和String.Equals的更多说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.