Рекомендация 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
}
Ответы
Ответ 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
были пустыми (в вашем случае).