Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Object.Equals比从实例调用String.Equals更受欢迎?_C#_String_Equality - Fatal编程技术网

C# 为什么Object.Equals比从实例调用String.Equals更受欢迎?

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

我正在准备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.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的情况下可能是安全的,尽管==应该只在字符串的特定情况下考虑这一点,或者任何其他类型,其中==对于非空操作数返回等于。你说得对!问题中有一个短语方法不能抛出异常。你说得对!问题中有一个短语方法不能抛出异常。