- PVSM.RU - https://www.pvsm.ru -
В С# существует два способа преобразования объектов: использовать оператор 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.DoSomething(), и дамп сбоя подтвердит, что переменная foo является null. Однако этого может и не быть в дампе сбоя. Возможно, дамп сбоя захватывает лишь параметры, которые участвовали в выражении, которое в свою очередь привело к исключению. Или может быть переменная thing попадёт в сборщик мусора. Вы не можете определить где проблема когда GetCurrentItem возвращает null или GetCurrentItem возвращает объект другого типа, отлично от типа Foo. И что это если не Foo?
Во втором варианте также могут возникнуть ошибки. Если объект thing является null, при вызове метода foo.DoSomething() ты получишь исключение NullReferenceException. Однако, если объект thing имеет другой тип, сбой произойдет в точке преобразования типов и выдаст исключение InvalidCastException. Если повезёт, отладчик покажет что именно нельзя преобразовать. Если не сильно повезёт, можно будет определить где произошел сбой по типу выданного исключения.
Задание: Оба варианта ниже функционально эквивалентны. Какой будет проще отладить?
// вариант 1 collection.FirstOrDefault().DoSomething();// вариант 2 collection.First().DoSomething();
Автор: Schvepsss
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/261272
Ссылки в тексте:
[1] Источник: https://habrahabr.ru/post/334274/
Нажмите здесь для печати.