Resharper建议:检查参考相等性

gia*_*min 20 c# resharper equality

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

if ( typeToTranslate.Equals( typeof(string) ) )
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

为什么这应该更好:

typeToTranslate == typeof(string)
Run Code Online (Sandbox Code Playgroud)

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

这是方法存根:

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
 }
Run Code Online (Sandbox Code Playgroud)

Mic*_*Liu 23

Object.Equals是一个更一般的实物比参考平等机会的:如果x == y然后x.Equals(y),但反过来未必是真实的.但是,如MSDN Library中所述:

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

因为ReSharper将"通用实践和代码改进"下的"检查引用相等性"检查选项分类,我的猜测是ReSharper告诉您,使用引用相等性来比较类型就足够了; 你不需要Equals方法隐含的更一般的平等(即使对于类型,两者是等价的).


Stu*_*nge 15

System.Type文档:

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

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

至于为什么ReSharper说使用"更好" ==代替.Equals()?我的猜测是因为==效率更高,并且没有冒险抛出NullReferenceExceptionif typeToTranslate为null(在你的情况下).