Комментарии 19
Фига се воды разлили. Достаточно ведь было сказать "нет, т.к. foreach не умеет игнорировать null, да и не обязан, в общем-то".
А мне интересно иногда копнуть вглубь или вширь.
В данном случае получилось вширь — не просто сказали, что нельзя, а посмотрели чуть шире — рассказали историю доработок (как, что, зачем), посмотрели на реальные примеры ошибок.
Но, конечно, на вкус и цвет. Впрочем, как и всегда. :)
— объяснении, что foreach это синтаксический сахар для…
— объяснении, что оператор… это синтаксический сахар для…
Все остальное уже было понятно на этом этапе, и вот честное слово, никакой глуби больше в этой теме вообще нет. То есть воды все-таки чуть многовато. На мой вкус, да.
Так про "вглубь" я и не говорил — там выше ссылочка на другую статью. :)
Тут разные аспекты — немного про foreach (откуда там NRE), немного про историю доработок, немного — про примеры ошибок. Мне, например, было интересно посмотреть на эти ошибки — другим людям тоже бывает. Для того они и приведены.
Так или иначе, спасибо за мнение. :)
Так по-моему ее тут и нет. Ну т.е. если посмотреть на похожие языки (в голову первым приходит груви), то там будет ровно все тоже самое. Ну посудите сами,?.. это типа «безопасный доступ» к полю или методу объекта по ссылке. Если ссылка (пусть будет a) нулл, то a.b.c просто упадет сразу, а a?.b?.c вернет нулл. То есть,?.. оно от нуллов не избавляет, и ведет себя плюс-минус совершенно так же.
А так текст вообще норм, ну чуток может растянут, немножко.
Все базируется на простых фактах.
- Все ли понимают, что?.. может вернуть null. Думаю, все. Никто не спорит с тем, что Вы написали выше. :)
- Все ли понимают, что если null будет использоваться в перечислимом выражении foreach, словам NRE? Не все.
- Все ли понимают, почему? Не все.
- Ошибаются так люди? Да.
- А пруфы есть? Есть.
Ergo, это может быть интересно тем, кто чего-то не знает. Все просто как 5 копеек. :)
— пункт 1
— пункт 2
— если для вас это очевидно, можете дальше не читать,
но имейте в виду, что вот мы для вас написали правило анализатора
— более длинная история
Ну как-то так.
Кажется, что вариант с использованием оператора?.. более безопасный. Но так ли это на самом деле?Простите, а кому так кажется? Совершенно очевидно, что "?." может вернуть null, этот оператор, собственно, для этого и предназначен. А если он вернёт null, то foreach навернётся. В чём здесь тайная магия?
> не используйте оператор?.. в перечислимом выражении foreach прямо или косвенно — это только иллюзия безопасности;
foreach (var item in obj?.collection ?? Enumerable<T>.Empty()) { .. }
Что вы сами и привели в качестве примера (да, я читал статью по диагонали...)
Единственное, что я бы исправил — это как записан блок
if (collection != null)
{
foreach (var item in collection.Where(predicate))
Console.WriteLine(item);
}
А точнее применение фигурных скобок. Отталкиваясь от стиля, заданного изначально, если внутри цикла одно действие — мы не ставим фигурных скобок, я бы опустил этот момент и в условии, в результате получилось бы:
if (collection != null)
foreach (var item in collection.Where(predicate))
Console.WriteLine(item);
Получилось бы визуально более коротко, и еще проще, чем в варианте с ?? Enumerable.Empty()
Использование оператора '?.' в foreach: защита от NullReferenceException, которая не работает