【问题标题】:Resharper suggestion: check for reference equality insteadResharper 建议:改为检查引用相等性
【发布时间】:2012-11-30 15:07:24
【问题描述】:

我不明白为什么 Resharper 建议我在这段代码中“检查引用相等性”:

if ( typeToTranslate.Equals( typeof(string) ) )
{
    //do something
}

为什么这应该更好:

typeToTranslate == typeof(string)

------------编辑------------

这是方法存根:

protected IType TranslateType(Type typeToTranslate)
{
    if (typeToTranslate == null) throw new ArgumentNullException("typeToTranslate");

    //do some stuff

    if (typeToTranslate.Equals(typeof(string)))
    {
        //do some stuff
    }
    //return some stuff
 }

【问题讨论】:

  • 我的 Resharper 不建议这样做?
  • @Thomas 我使用的是 7.0.1 版
  • typeToTranslate 实际上是 Type 对象,而不是其他类型吗?
  • @Servy 是一个 Type 对象:我添加了更全面的代码 sn-p
  • 可能重复:stackoverflow.com/questions/9234009/…(接受的答案链接了一篇很好地解释了这一点的文章)

标签: c# resharper equality


【解决方案1】:

Object.Equals 是一种比引用相等更通用的相等类型:如果x == y 则为x.Equals(y),但反过来不一定正确。但是,正如MSDN Library 中所述:

表示类型的Type对象是唯一的;也就是说,两个 Type 对象引用当且仅当它们代表相同的类型时才引用相同的对象。这允许使用引用相等比较 Type 对象。

因为 ReSharper 将“检查引用相等性”检查选项分类在“通用实践和代码改进”下,我猜 ReSharper 让您知道使用引用相等性进行比较足够类型;您不需要 Equals 方法所暗示的更一般的相等性(即使对于类型,两者是等价的)。

【讨论】:

    【解决方案2】:

    来自System.Type documentation

    表示类型的 Type 对象是唯一的;即两种类型 对象引用引用同一个对象当且仅当它们 代表同一类型。这允许比较 Type 对象 使用引用相等。

    这意味着"string".GetType()typeof(string) 返回相同的引用。 AppDomain 中的 System.String 只有一个 System.Type 对象实例。

    为什么 ReSharper 说使用 == 而不是 .Equals() “更好”?我的猜测是因为== 效率更高,并且如果typeToTranslate 为空(在您的情况下),则不会冒险抛出NullReferenceException

    【讨论】:

    • 我检查 typeToTranslate 不为空,所以它可能只是为了提高效率
    • @giammin : 这对 R# 来说已经足够了!
    • 如果您写Equals(typeToTranslate, typeof(string)),也会出现该建议,因此NullReferenceException 不太可能是原因。
    • @Michael -- 很公平。不幸的是,R# 没有“为什么 resharper 建议这样做?”此特定建议的条目。听听他们的推理会很好。对我来说,如果可能的话,“更喜欢” == 和引用相等具有一些直观的意义,因为引用相等是一种更简单的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2015-08-09
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多