Resharper建议:检查参考相等性

时间:2012-11-30 15:07:24

标签: c# resharper equality

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

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

为什么这应该更好:

typeToTranslate == typeof(string)

------------ ------------ EDIT

这是方法存根:

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
 }

2 个答案:

答案 0 :(得分:23)

Object.Equals是一种比参考平等更普遍的平等:如果x == y然后是x.Equals(y),但反过来不一定是真的。但是,如MSDN Library中所述:

  

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

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

答案 1 :(得分:15)

来自System.Type documentation

  

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

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

为什么ReSharper说使用==代替.Equals()“更好”?我的猜测是因为==效率更高,如果NullReferenceException为空(在您的情况下),则typeToTranslate无法抛出{{1}}。