Как стать автором
Обновить
0
Microsoft
Microsoft — мировой лидер в области ПО и ИТ-услуг

Если нет разницы между двумя вариантами кода, выбирай тот, который проще отладить

Время на прочтение2 мин
Количество просмотров8.4K
Автор оригинала: Raymond Chen
В С# существует два способа преобразования объектов: использовать оператор as, который пытается преобразовать объект и в случае успеха возвращает результат, в случае неудачи null; или использовать оператор преобразования.



Какой из этих вариантов выбрать, когда нужно немедленно воспользоваться результатом преобразования?

// вариант 1
var thing = GetCurrentItem();
var foo = thing as Foo;
foo.DoSomething();

// вариант 2
var thing = GetCurrentItem();
var foo = (Foo)thing;
foo.DoSomething();

Теперь предположим, что объект thing не является типом Foo. Оба варианта отработают некорректно, однако сделают они это по-разному.

В первой варианте отладчик выдаст исключение NullReferenceException в методе foo.Do­Something(), и дамп сбоя подтвердит, что переменная foo является null. Однако этого может и не быть в дампе сбоя. Возможно, дамп сбоя захватывает лишь параметры, которые участвовали в выражении, которое в свою очередь привело к исключению. Или может быть переменная thing попадёт в сборщик мусора. Вы не можете определить где проблема когда GetCurrentItem возвращает null или GetCurrentItem возвращает объект другого типа, отлично от типа Foo. И что это если не Foo?

Во втором варианте также могут возникнуть ошибки. Если объект thing является null, при вызове метода foo.Do­Something() ты получишь исключение NullReferenceException. Однако, если объект thing имеет другой тип, сбой произойдет в точке преобразования типов и выдаст исключение InvalidCastException. Если повезёт, отладчик покажет что именно нельзя преобразовать. Если не сильно повезёт, можно будет определить где произошел сбой по типу выданного исключения.

Задание: Оба варианта ниже функционально эквивалентны. Какой будет проще отладить?

// вариант 1
collection.FirstOrDefault().DoSomething();

// вариант 2
collection.First().DoSomething();
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Переводить ли в дальнейшем подобные заметки Рэймонда Чена из блога The Old New Thing?
82.09% Да165
17.91% Нет36
Проголосовал 201 пользователь. Воздержались 74 пользователя.
Теги:
Хабы:
Всего голосов 33: ↑22 и ↓11+11
Комментарии43

Публикации

Информация

Сайт
www.microsoft.com
Дата регистрации
Дата основания
Численность
Неизвестно
Местоположение
США

Истории