【发布时间】:2016-01-19 12:14:06
【问题描述】:
我正在准备 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) 是错误的。
为什么?
【问题讨论】:
-
可能是因为
NullReferenceException更有可能在第二种情况下被抛出?你可以让你的*对象在这两种情况下都抛出它,但是如果第一个对象的Name属性是null,那么你这样做的第一种方法将返回false,而第二种方法将抛出异常。 -
也许在
Name为空的情况下是安全的,尽管==应该注意这一点(仅在字符串的特殊情况下,或==回退的任何其他类型到Equals对于非空操作数)。