Как стать автором
Обновить

Комментарии 14

Любимая ошибка новичков в C# — конкатация строк в циклах.

ни один новичок не знает, как работает дотнет под капотом (когда узнает — становится мидлом :) ), с их стороны это вполне разумно и логично.

Тоже самое но в большей степени можно сказать про любую из упомянутых в статье ошибок. Да и упомянутую работу со стрингами в циклах я неоднократно видел у претендующих на позиции мидлов.
и в подавляющем большинстве случаев это не страшно
) кроме тех, где такой подход на порядки снижает производительность
В реальности, код, который должен работать максимально эффективно и без лишних аллокаций, джуны (да и мидлы) не пишут. Во всех прочих случаях «жсонки в монгу» короткоживущие строки производительность не аффектят на фоне сетевого взаимодействия и обработки запросов хранилищем.
Я видел такой код в реальности. Да и сам писал по началу. И не в тестовых заданиях, а в доработках на прод.
Лично я столкнулся с этой проблемой, когда писал код формирования кода HTML страницы с большой таблицей данных. И нет, это было не ASP.net. И очень удивлялся тому, как долго страница формируется.

Очевидно, вы были не синьором.

Да. Это было на заре карьеры.
И всё-таки моё мнение, что мидл должен знать такие вещи.
Ну это не самое страшное и легко находится профайлером. Самые страшные ошибки — это ошибки в архитектуре и выборе неправильных подходов к решению задачи (например выбор неверной сторонней библиотеки).
Я не на все 100% уверен в причине, по которой значения NULL из базы данных обрабатываются следующим образом (пожалуйста, прокомментируйте ниже, если знаете!), но Microsoft решил представить их специальным типом DBNull (со статическим полем Value).

Могу ошибаться, но по-моему DBNull в ADO.NET это наследник ADO который был задизайнен до того, как начали разрабатывать .NET
Кроме того, в первых версиях C# красивостей вроде reader.GetString(0) ?? «NULL»; не было и было без разницы с чем сравнивать.
Да и вообще, подозреваю, что изначально null в C# был задизайнен как «пустая ссылка» ибо доступен только ссылочным типам, для value типов была обертка Nullable и то, кажется со второй версии дотнета, ибо дженерики только тогда появились.
Это потом уже, когда сильно часто стали использовать null-ы для value-типов добавили сахару вроде int?

В общем, DBNull.Value просто наследие с древних времен.

Да и пример reader.GetString(0) не совсем корректен, ведь что если у нас там INT NULLABLE? Есть метод GetFieldValue<T>(и даже async-вариант), но я не проверял, умеет ли он в Nullable<T>.


К тому же, reader.GetString возвращает string, а DBNull.Value — чтож, DbNull, так что даже этот вариант не сработает — эти типы нельзя между собой сравнивать.

Тьфу.

Не плюйтесь на базовую обертку работы с БД.


Примитивных типов не так много, всегда можно сделать свой generic extension, который будет работать именно так, как вам надо.

DbNull — это со времён ДО Nullable. Ну и обратная совместимость. Кстати, GetXXX() для колонки, в которой «лежит» NULL — вызовет ошибку. Нужно вызывать сперва IsDbNull()

Зарегистрируйтесь на Хабре, чтобы оставить комментарий