【问题标题】:Why is Object.Equals preferred to calling String.Equals from an instance?为什么 Object.Equals 比从实例调用 String.Equals 更受欢迎?
【发布时间】: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 对于非空操作数)。

标签: c# string equality


【解决方案1】:

因为如果x.Namenullx.Name.Equals(y.Name) 将抛出 NullReferenceExceptionObject.Equals(x.Name, y.Name) 将执行有效比较

【讨论】:

  • 你说得对!问题中有短语“方法不得抛出异常”。
【解决方案2】:

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

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

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

阅读更多关于Object.EqualsString.Equals的解释

【讨论】:

    猜你喜欢
    • 2019-06-11
    • 2020-10-25
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2018-08-31
    • 2012-12-06
    • 2013-08-22
    相关资源
    最近更新 更多