我正准备在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)
是错误的。
为什么?
答案 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方法来进一步测试相等性。