В С# существует два способа преобразования объектов: использовать оператор
Какой из этих вариантов выбрать, когда нужно немедленно воспользоваться результатом преобразования?
Теперь предположим, что объект
В первой варианте отладчик выдаст исключение
Во втором варианте также могут возникнуть ошибки. Если объект
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();
Only registered users can participate in poll. Log in, please.
Переводить ли в дальнейшем подобные заметки Рэймонда Чена из блога The Old New Thing?
82.09% Да165
17.91% Нет36
201 users voted. 74 users abstained.