为什么Object.Equals更喜欢从实例调用String.Equals?

时间:2016-01-19 12:14:07

标签: c# string equality

我正准备在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)是错误的。

为什么?

2 个答案:

答案 0 :(得分:7)

如果x.Name.Equals(y.Name) NullReferenceException x.Name null Object.Equals(x.Name, y.Name)awakeWithContext(context: AnyObject?)执行有效比较,override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) // Configure interface objects here. if context != nil{ let somevalue = context as? [String] { if somevalue.count > 0 { let text = somevalue[0] showWat.setText(text) } } else { // Unwrapped optional is nil print("someValue is nil!") } } } 会抛出let b = bufwinnr(the_buffer_name_or_id)

答案 1 :(得分:1)

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

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

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

阅读有关Object.EqualsString.Equals

的更多说明