C# Portal | Программирование
15K subscribers
755 photos
86 videos
19 files
666 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
Я ждал эту фичу 4 года и вот наконец она появляется в EF Core 10

EF Core 10 приносит серьёзное улучшение в метод
ExecuteUpdateAsync

Раньше
, чтобы сделать динамическое обновление, нужно было вручную собирать сложные и склонные к ошибкам expression tree'и.

Например: ты хочешь обновить поле Views у блога и, при определённом условии, ещё и Name.
Раньше это значило писать довольно громоздкую логику вручную через expression API.

Теперь — всё стало намного проще:
↳ можно просто использовать обычную лямбду, внутри которой разрешены if и другие управляющие конструкции.

это улучшение делает код гораздо читаемее, поддерживаемее и снижает риск багов, связанных с ручной генерацией выражений.

Ждёшь эту фичу так же, как и я?
Дай знать, что думаешь 👍

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥232
Если ты используешь GUID'ы в C# коде, тебе наверняка понравится нововведение в .NET 9: GUID версии 7.

GUID — глобально уникальный идентификатор) гарантирует уникальность значений между разными источниками.

В предыдущих версиях C# новые записи вставлялись в случайные позиции, что приводило к фрагментации индексов.

В .NET 9 появилась поддержка GUID версии 7, которые создаются последовательно.

Благодаря этому GUID теперь лучше подходят для использования в реляционных базах данных.

Кроме того, при генерации нового GUID теперь можно передать DateTimeOffset, чтобы задать собственное значение временной метки.

Ты уже начал использовать GUID версии 7? 😏

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍208
Чувствуешь, что отстаёшь в .NET?

Вот 10 лучших статей, которые помогут быстро наверстать:

🔸Дорожная карта .NET-разработки на 2025 год (минималистичная версия)
https://devsecrets.net/post/net-development-roadmap-minimalist-edition/

🔸10 фатальных ошибок .NET-разработчиков
https://devsecrets.net/post/10-fatal-mistakes-net-developers-make/

🔸MediatR? Не в моём .NET-стеке
https://devsecrets.net/post/mediatr-not-in-my-net-stack/

🔸Ноль опыта с Azure? Начни отсюда
https://devsecrets.net/post/zero-azure-cloud-experience/

🔸Модульный монолит — архитектурный паттерн, о котором все забывают
https://devsecrets.net/post/modular-monolith/

🔸 Как справляться с неопределённостью при проектировании систем
https://devsecrets.net/post/how-to-beat-uncertainty-when-designing-systems/

🔸 7 мощных методов LINQ, о которых ты пожалеешь, что не знал раньше
https://devsecrets.net/post/7-powerful-linq-methods/

🔸Исключения убивают приложения. Как с этим бороться
https://devsecrets.net/post/throwing-exceptions-kills-apps/

🔸Как я выкатываю недоделанный код в прод (и почему тебе тоже стоит)
https://devsecrets.net/post/how-i-push-unfinished-work-to-production/

🔸4 проверенных способа, как тесты выявляют ужасный код
https://devsecrets.net/post/4-proven-ways-how-tests-reveal-awful-code/


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
😐7👍42
Простой способ улучшить методы в C#
(с переменным числом параметров)

Используй улучшения ключевого слова params из .NET 9.

Ключевое слово params в C# позволяет передавать переменное количество аргументов без необходимости перегрузки методов. Это удобно, когда количество входных параметров заранее неизвестно.

Раньше:
params работал только с массивами.

Теперь в C# 13 и .NET 9:
params можно использовать с любыми коллекциями, у которых есть метод Add, включая:

- Span<T>
- ReadOnlySpan<T>
- IEnumerable<T>

Это упрощает код и делает API гибче.

А ты уже используешь это улучшение?🤠

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍13🔥3
90% C#‑проектов на старте не нуждаются в следующем:

🔸Kubernetes
🔸Микросервисах
🔸Разделении БД на чтение/запись

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

Но при этом желательно предусмотреть базовый дизайн,
чтобы в будущем система могла эволюционировать.

Несколько месяцев назад я наткнулся на следующий репозиторий на GitHub:
"Evolutionary Architecture by Example"


Ссылка на репозиторий: https://github.com/evolutionary-architecture/evolutionary-architecture-by-example

Он показывает, как постепенно развивать архитектуру .NET‑приложения.

В нём выделено 4 этапа:

🔸Начальная архитектура — фокус на простоте
🔸Выделение модулей — фокус на поддерживаемости
🔸Выделение микросервисов — фокус на масштабировании
🔸Применение тактического DDD — фокус на сложности бизнес-домена

Архитектура начинается с малого,
но со временем развивается по мере роста требований.

Запомните:
Простота масштабируется. Сложность — ломается.


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥5😁2🥴1
Использование Dapper

Я заметил, что есть отличные примеры для простых чтений, но практически нет примеров работы с более чем двумя JOIN'ами.

Это означает, что разработчику нужно хорошо разбираться как в SQL, так и в синтаксисе Dapper.

Пример:

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
This media is not supported in your browser
VIEW IN TELEGRAM
Пробовал ли ты функцию автоподсказок в встроенном терминале VS Code? Она даёт молниеносные автодополнения — например, динамические подсказки по веткам или навигации по путям.

Включается через настройку "terminal.integrated.suggest.enabled" (по умолчанию активна в версии Insiders)

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
11
Одна команда сделала мою работу с GIT гораздо комфортнее.

Вот в чём суть:

Я работал над проектом в команде из 5+ разработчиков.
Каждый день было много коммитов — в основном, вполне нормальных.

Но в один момент кто-то (не я) запушил локальные настройки базы данных.
К счастью, это положило только дев-среду.

Решением было «удалить» этот коммит и откатить ветку к предыдущему стабильному состоянию.

И у GIT есть идеальная команда для этого — git reset.

С помощью этой команды можно откатиться к нужному коммиту и убрать все последующие

Как это работает:

🔸Ты указываешь хеш коммита, который должен стать новым HEAD
🔸GIT откатывает ветку до этого коммита и удаляет все коммиты после него

Эти «висящие» коммиты становятся осиротевшими (orphan commits).

У git reset есть три режима:

--soft — изменения остаются в стейдже (index)
--mixed (по умолчанию) — изменения снимаются со стейджа, остаются в рабочей копии
--hard — изменения полностью откатываются (и из стейджа, и из рабочей директории)

В своей практике я чаще всего использовал --hard, но в паре случаев пригодился и --soft.

А какой у тебя опыт с этой командой? 🙌

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍2
Как правильно структурировать фичу в формате вертикального среза?

Вот простая структура вертикального среза, которую можно смело брать на вооружение:

🔸Объект запроса/ответа
🔸Определение эндпоинта
🔸Бизнес-логика

Всё, что относится к одной фиче, находится в одном месте.

Почему это круто — объяснено здесь

Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🤔54
𝟵𝟬% разработчиков используют пагинацию на основе Offset

Потому что не знают, как реализовать пагинацию на основе Cursor.

Offset-based пагинация — один из самых простых и широко используемых способов постраничной загрузки данных.
Она работает по принципу: сначала пропускается заданное количество записей (offset), а затем выбирается фиксированное количество записей (page size).

Offset-подход использует два параметра:

- offset — количество записей, которые нужно пропустить
- limit (или page size) — количество записей, которые нужно выбрать

Плюс: простота реализации
Минус: производительность сильно падает при больших offset-значениях, потому что БД вынуждена просканировать все строки до нужного места.

👉 Даже если используются индексы, базе всё равно приходится проходить через все строки.

Cursor-based пагинация (она же keyset или seek пагинация) — более эффективный метод для работы с большими объемами данных.

Вместо того чтобы "перепрыгивать" через записи, cursor-подход получает следующую порцию данных начиная с определённой позиции — курсорa.

Курсор обычно основывается на уникальном или отсортированном столбце (например, id или timestamp).

Он представляет собой уникальное значение (или комбинацию значений), по которому можно однозначно определить позицию следующей страницы данных.

Но такой подход требует более сложной реализации.

Вот гайд с подробным разбором:

➡️Пагинации на основе Offset
➡️Пагинации на основе Cursor
➡️Расширенных техник работы с курсорами по нескольким полям
➡️Кодирования и декодирования курсоров

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥1
Вот настройка OpenTelemetry для трассировки и логирования в .NET:

Если хочешь узнать больше, то вот гайд как экспортировать телеметрию в Grafana 👍

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Как работать с представлениями в EF Core?

Вот краткий разбор:

Представления — это виртуальные таблицы, содержащие данные из одной или нескольких таблиц в SQL.

Отличие от физических таблиц в том, что сами данные они не хранят.

Можно воспринимать их как заранее определённые SQL-запросы для выборки данных.

А как EF Core с ними работает?

Почти так же, как и с обычными таблицами, но с небольшими отличиями.

В классе DbContext нужно сконфигурировать тип, привязанный к view, как тип без ключа (HasNoKey()), поскольку у представлений нет первичного ключа, и замапить его на соответствующее представление в базе.

И всё. Можно работать. 🌟

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43
Оператор конкатенации ANSI SQL (||) теперь поддерживается в базе данных Azure SQL

Он предлагает «более читаемую и соответствующую стандарту альтернативу существующим способам вроде + и CONCAT()».

А ты как считаешь? 🧀

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥63🤨2
This media is not supported in your browser
VIEW IN TELEGRAM
Еще одна бесплатная платформа — Ulearn.me


С интерактивными курсами по программированию (есть C#), разработанная в компании СКБ Контур.

Каждый курс включает теоретические материалы, интерактивные задания и тесты для закрепления знаний.

Начать обучение можно в любое удобное время 🌟

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
Когда-нибудь нужно было открыть эндпоинт для внешней системы, но не хотелось поднимать полноценную систему аутентификации?

Аутентификация по API-ключу — простой и эффективный вариант.

В ASP.NET Core для этого можно использовать IAuthorizationFilter.

Он встраивается в pipeline запроса и может быть внедрён через Dependency Injection

Хорошо подходит для:
- внутренних тулов
- вебхуков
- плановых задач
- интеграций с внешними сервисами

Ты сам определяешь:
- как передаётся ключ
- как он валидируется
- какие эндпоинты его требуют

Гайд с рабочим примером, который можно просто скопировать и адаптировать: здесь

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍1
Большинство .NET разработчиков никогда с этим не сталкиваются.

Но это делает отладку в 10 раз проще.

Стандартный вид при отладке:

{Namespace.ObjectName}


Никакого контекста. Много путаницы.

Но всего одной строкой кода?

Теперь окно наблюдения показывает:

Order ORD-2025-001: Alice Smith - 249.99
Order ORD-2025-002: Bob Evans - 89.50
Order ORD-2025-003: Maria Lee - 1200.00


В чём фишка?

Используйте DebuggerDisplay.

Добавляете этот атрибут в начало класса, чтобы контролировать, как будет отображаться информация о классе при отладке.

В следующий раз, когда будете смотреть на {Namespace.ObjectName}, помните: так не обязательно должно быть.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥285👍4🤔1🌚1
Новая библиотека для планирования задач, которая превосходит Quartz и Hangfire

3 недели назад вышла новая библиотека под названием TickerQ.

Что такое TickerQ?

TickerQ — высокопроизводительный планировщик, разработанный специально для .NET. Он фокусируется на простоте, масштабируемости и минимальном потреблении ресурсов.

Почему она лучше?


Традиционные библиотеки, такие как Quartz и Hangfire, имеют известные недостатки:

↳ Quartz:
• Сложный API, тяжело для новичков
• Отсутствие типобезопасности при передаче параметров в Job
• Потери в производительности из-за использования рефлексии

↳ Hangfire:
• Ограниченная поддержка DI и async-операций
• Простейшая логика повторных попыток (retry)
• Потери в производительности из-за использования рефлексии

Как TickerQ решает эти проблемы:

1️⃣Легковесный и интуитивно понятный API
2️⃣Без рефлексии, использует source generators
3️⃣Нативная поддержка распределённого планирования без дополнительной сложности
4️⃣Встроенная логика повторных попыток и упрощённая обработка ошибок

Quartz и Hangfire долгое время были стандартом, но теперь есть лучший вариант.

Что думаете про эту новую библиотеку для планирования? Попробуете TickerQ или останетесь на Quartz или Hangfire?

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍175