C# 为什么Object.Equals比从实例调用String.Equals更受欢迎?
我正在准备C上的认证,并面临以下问题代码为简单起见进行了编辑:C# 为什么Object.Equals比从实例调用String.Equals更受欢迎?,c#,string,equality,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(Obj
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.Equalsy.Name将抛出NullReferenceException,而Object.Equalsx.Name、y.Name将执行有效比较因为如果x.Name为null,而Object.Equalsx.Name为null,x.Name.Equalsy.Name将抛出NullReferenceException,y.Name将执行有效的比较Object.Equals首先比较对象引用,然后调用String.Equals进行进一步的相等性检查
Equals测试字符串是否相等。使用方法名Equals或equality运算符调用它
Equals比较对象的内容。它首先检查引用是否相等,object.ReferenceEquals也是如此。但随后它调用派生的Equals方法来进一步测试相等性
阅读有关和的详细说明。Object.Equals首先比较对象引用,然后调用String.Equals进行进一步的相等性检查
Equals测试字符串是否相等。使用方法名Equals或equality运算符调用它
Equals比较对象的内容。它首先检查引用是否相等,object.ReferenceEquals也是如此。但随后它调用派生的Equals方法来进一步测试相等性
阅读更多关于和的解释这可能是因为在第二种情况下更可能引发NullReferenceException吗?您可以让*对象在这两种情况下都抛出它,但是如果第一个对象的Name属性为null,那么第一种方法将返回false,而第二种方法将抛出异常。在Name为null的情况下可能是安全的,尽管==应该只在字符串的特定情况下考虑这一点,对于非空操作数,==返回等于的任何其他类型。这可能是因为在第二种情况下更可能引发NullReferenceException吗?您可以让*对象在这两种情况下都抛出它,但是如果第一个对象的Name属性为null,那么第一种方法将返回false,而第二种方法将抛出异常。在Name为null的情况下可能是安全的,尽管==应该只在字符串的特定情况下考虑这一点,或者任何其他类型,其中==对于非空操作数返回等于。你说得对!问题中有一个短语方法不能抛出异常。你说得对!问题中有一个短语方法不能抛出异常。