23

我不明白为什么 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
 }
4

2 回答 2

26

Object.Equals是一种比引用相等更一般的相等: if x == ythen x.Equals(y),但反过来不一定是正确的。但是,如MSDN Library中所述:

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

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

于 2012-11-30T15:28:57.970 回答
15

System.Type 文档

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

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

至于为什么 ReSharper 说使用==而不是“更好” .Equals()?我的猜测是因为==效率更高,并且不会冒险抛出NullReferenceExceptioniftypeToTranslate为 null (在您的情况下)。

于 2012-11-30T15:18:44.853 回答