Почему Решарпер предпочитает «как» вместо «есть»?

13

Когда я пишу такой код, где obj является локальной переменной:

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

Решарпер предлагает преобразовать его в код, подобный следующему:

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

Я предпочитаю первое, поскольку оно не дает возможности для случайных исключений нулевых ссылок. Какие есть причины для предпочтения другой формы?

Почему Resharper рекомендует это?

Дэйв Хиллиер
источник

Ответы:

25

Сначала посмотрите на ответ Джона Скита на общий вопрос о приведении в C #:

Не делай этого:

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

Это не только проверка дважды, но и проверка разных вещей, если randomObject является полем, а не локальной переменной. Возможно, что «если» пройдет, но приведение завершится неудачей, если другой поток изменит значение randomObject между двумя.

(...)

Если randomObject может быть экземпляром TargetType и TargetType является ссылочным типом, используйте код, подобный следующему:

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

Тогда посмотрите похожие темы:

yBee
источник
1
+1 Смотрите также сообщение в блоге Эрика Липперта на эту тему.
Брайан