为什么 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.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 and String.Equals
的更多说明
我正在准备 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 and String.Equals
的更多说明