Подтвердить что ты не робот

Рекомендация Resharper: вместо этого выполните проверку ссылочного равенства

Я не понимаю, почему 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
 }
4b9b3361

Ответ 1

Object.Equals является более общим видом равенства, чем ссылочное равенство: if x == y then x.Equals(y), но обратное не обязательно верно. Однако, как описано в MSDN Library:

Объект Тип, представляющий тип, уникален; то есть две ссылки объекта Тип относятся к одному и тому же объекту тогда и только тогда, когда они представляют один и тот же тип. Это позволяет сравнивать объекты Тип с использованием ссылочного равенства.

Поскольку ReSharper категоризирует опцию проверки "Проверить ссылочное равенство вместо" в разделе "Общие практики и улучшения кода", я предполагаю, что ReSharper позволяет вам знать, что для сравнения типов достаточно использовать ссылочное равенство; вам не нужен более общий вид равенства, подразумеваемый методом Equals (хотя для типов два эквивалентны).

Ответ 2

Из документации System.Type:

Объект Type, представляющий тип, уникален; то есть два типа ссылки на объекты ссылаются на один и тот же объект тогда и только тогда, когда они представляют один и тот же тип. Это позволяет сравнивать объекты типа используя ссылочное равенство.

Это означает, что "string".GetType() и typeof(string) возвращают одну и ту же ссылку. Существует только один экземпляр объекта System.Type для System.String в AppDomain.

Что касается того, почему ReSharper говорит "лучше" использовать == вместо .Equals()? Я предполагаю, что == более эффективен и не рискует выбросить NullReferenceException, если typeToTranslate были пустыми (в вашем случае).