Чому Resharper віддає перевагу "як" перед "є"?


13

Коли я пишу такий код, де obj - локальна змінна:

if (obj is IMyInterface)
{
   var result = (IMyInterface)obj;
   // ....
}

Resharper пропонує змінити його в такий код:

var result = obj as IMyInterface;
if (result != null)
{
   // ...
}

Я віддаю перевагу першому, оскільки він не надає можливості для випадкових виняткових нульових винятків. Які причини для того, щоб віддати перевагу іншій формі?

Чому Решарпер рекомендує це?

Відповіді:


25

Спочатку подивіться на відповідь Джона Скіта на загальне запитання про кастинг на C #:

Не робіть цього:

if (randomObject is TargetType)
{
    TargetType foo = (TargetType) randomObject;
    // Do something with foo
}

Це не лише двічі перевірка, але й перевірка різних речей, якщо randomObject - це поле, а не локальна змінна. Можливо, щоб "if" пройшов, але тоді кастинг не вдасться, якщо інший потік змінює значення randomObject між двома.

(...)

Якщо randomObject може бути екземпляром TargetType, а TargetType є еталонним типом, тоді використовуйте такий код:

TargetType convertedRandomObject = randomObject as TargetType;
if (convertedRandomObject != null)
{
    // Do stuff with convertedRandomObject
}

Потім подивіться подібні теми:


1
+1 Дивіться також тему блогу Еріка Ліпперта .
Брайан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.