【问题标题】:Char.Equals vs Object.Equals -- ReSharper suggests that I should use Object.Equals. Should I?Char.Equals vs Object.Equals -- ReSharper 建议我应该使用 Object.Equals。我是不是该?
【发布时间】:2012-01-28 19:17:35
【问题描述】:

基本上,我想知道在这种情况下我是否应该听 ReSharper...

您认为与字符相比应该使用 Char.Equals(char),因为它可以避免拆箱,但 Resharper 建议使用 Object.Equals(obj)。也许我在这里遗漏了什么?


private const DEFAULT_CHAR = '#';

// DependencyProperty backing
public Char SpecialChar
{
    get { return (Char)GetValue(SpecialCharProperty); }
}

// ReSharper - Access to a static member of a type via a derived type.
if (Char.Equals(control.SpecialChar, DEFAULT_CHAR)) { ... }

我猜是因为有 DependencyProperty 支持?

【问题讨论】:

  • 我理解的 Equals 比较相似或不同的事物,例如你不会说 ObjectA == ObjectB 你会检查使用 ObjectA.Equals(ObjectB)
  • 实际的代码行是什么? ReSharper 是否对其建议给出任何理由?
  • 我的 resharper 不建议 :)
  • 这不是因为它是一个依赖属性,而是因为您通过后代类 (System.Char) 从 System.Object 调用静态方法。我认为 ReSharper 的警告消息(“通过派生类型访问类型的静态成员”)非常清楚。
  • 考虑一下,如果将Char.Equals 替换为Boolean.Equals、'System.Console.Equals, Uri.Equal` 等,您的代码会按预期工作。

标签: c# object char resharper object-equality


【解决方案1】:

不可能覆盖static 成员 - Object.Equals() 是静态成员,Char 不能 覆盖它,即使您可以调用它Char 类型(参数仍然是Object 类型)

因此,是否调用没有区别

Object.Equals(object yourChar, object anotherChar) 

Char.Equals(object yourChar, object anotherChar)

因为在任何一种情况下都会发生拳击。

为避免这种情况,请使用实例方法,该方法在Char被覆盖

if (yourChar.Equals(anotherChar)) doSomething();

【讨论】:

  • 我希望 resharper 会建议我使用 Equals 的覆盖实例版本。这是一个错误还是无法通过反射检测是否存在静态成员的实例版本?
  • 查看@Joe White 对这个问题的评论 - ReSharper 很有帮助,但它不能为您做一切。事实上,当我输入Char 然后输入.Equ 时,ReSharper 似乎已经覆盖了 IntelliSense 以 隐藏 Object.Equals...
【解决方案2】:

Char.Equals(control.SpecialChar, DEFAULT_CHAR) 是对Object.Equals(object, object) 的调用,因此 resharper 在这里是正确的。

我建议使用 control.SpecialChar.Equals(DEFAULT_CHAR) 要不就 DEFAULT_CHAR == control.SpecialChar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多