C# Portal | Программирование – Telegram
C# Portal | Программирование
14.9K subscribers
966 photos
118 videos
24 files
809 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
Rider 2025.2 теперь с расширенной поддержкой C# 14

Теперь доступны все свежие фичи языка:

> Extensions
> Partial events и конструкторы
> Null-conditional assignments

Плюс обновления анализа кода в Rider 2025.2 : подробнее

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135
Твой опыт с NuGet в .NET ограничивается AutoMapper?

Быть в курсе .NET = быть в курсе инструментов.

Не отставай — вот 24 NuGet-библиотеки

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥1
Когда исключения неизбежны, нужен механизм для их обработки.

Вот как это можно настроить за несколько минут:

Начиная с .NET 8 у вас есть интерфейс IExceptionHandler

Это абстракция для управления исключениями с одним методом: TryHandleAsync

Он отвечает за обработку исключений в пайплайне ASP.NET Core.

Метод возвращает true, если исключение обработано успешно, и false, если его нельзя обработать.

Это позволяет реализовать кастомную логику под разные сценарии.

Для конфигурации нужно сделать три шага:

1. Зарегистрировать сервис IExceptionHandler через dependency injection
2. Зарегистрировать ExceptionHandlerMiddleware в пайплайне запросов
3. Зарегистрировать ProblemDetails ответ

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

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65
Хочешь писать более чистый C#-код?

Начни с чистых функций.

Чистая функция проста:
Берёт входные данные, возвращает результат и больше ни на что не влияет.

Никаких запросов в базу. Никаких случайных значений. Никаких скрытых побочных эффектов

Такой код легче тестировать, отлаживать и ему проще доверять.

Если логика кажется непредсказуемой — попробуй вынести её в чистую функцию.
Удивишься, насколько всё станет понятнее.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🤨2
Примеры использования разделителя цифр (_) в C#

// Можно использовать в целых числах
int oneMillion = 1_000_000;
Console.WriteLine(oneMillion); // Выведет: 1000000

// Работает и с числами с плавающей точкой
double billion = 1_000_000_000.0;
Console.WriteLine(billion); // Выведет: 1000000000

// Поддерживается и в двоичной, и в шестнадцатеричной записи
int binary = 0b1010_1011_1100;
Console.WriteLine(binary); // Выведет: 2748

int hexadecimal = 0x1234_abcd;
Console.WriteLine(hexadecimal); // Выведет: 305441741


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥64
До сих пор выкатываешь новые фичи через if?

Есть решение получше.

В .NET есть отличная поддержка feature flags, и что важнее - таргетированных feature flags

Это значит, что можно включать функциональность:

- только для внутренних тестировщиков
- для определённого сегмента пользователей
- или даже для одного конкретного юзера

Больше никаких флагов "для всех сразу". Больше никаких костылей с разветвлённой логикой в коде.

Ты задаёшь правила, а .NET сам обрабатывает таргетинг.

А если совместить это с версионированием API, то получаешь полный контроль над тем, кто и когда увидит новое поведение.

Feature flags — это не просто переключатель кода. Это инструмент доставки продукта.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍213🔥2❤‍🔥1
dotnet-backend-blueprint.zip
63.6 KB
Устал каждый раз собирать .NET-проекты с нуля?

Есть готовый blueprint для .NET backend, в котором уже настроены 12 продакшен-фич:

- Современный .NET 9 Web API
- Архитектура Vertical Slice
- PostgreSQL + Entity Framework Core
- Преднастроенная аутентификация через Keycloak
- Swagger UI с поддержкой авторизации для интерактивного тестирования
- Глобальная обработка ошибок
- Локальная разработка с .NET Aspire без лишних танцев
- Интеграционные тесты на Test Containers
- Деплой на Azure в продакшн
- CI/CD пайплайны для GitHub Actions и Azure DevOps
- Поддержка GitHub Codespaces
- Шаблон dotnet new готов к установке

Это не очередной "Hello World". Это полноценный продакшен-бэкенд, который обычно занимает у разработчиков недели настройки.

Собран на Vertical Slice Architecture, потому что чистый код важнее, чем следование устаревшим слоёным паттернам.

Честно, если делаешь простые CRUD-приложения, это перебор. Но если нужен API, готовый к продакшену без мучений на старте этот шаблон сэкономит тебе 40+ часов.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6🔥2👏1
Разница между IN и EXISTS в SQL:

🔸IN

- Пишется проще
- Загружает все совпавшие ID в память
- Тормозит на больших таблицах (например, Customers)
- Может плохо работать без индексов
- В случае NOT IN падает, если подзапрос возвращает NULL

🔸EXISTS

- Останавливается на первом совпадении
- Лучше дружит с индексами
- Эффективнее при коррелированных подзапросах
- Корректно обходит NULL
- По производительности
- На маленьких выборках: разница минимальна
- На больших: чаще выигрывает EXISTS
- В коррелированных подзапросах: почти всегда лучше EXISTS

IN должен вычислить и сохранить весь результат подзапроса.
EXISTS просто проверяет — существует ли строка, и идёт дальше.

Современные оптимизаторы умеют уравнивать разницу, но понимать это полезно при работе с реальными данными.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍156🍌2
В dotnet 9 появился обобщённый OrderedDictionary

Во многих случаях нужно хранить пары ключ-значение с сохранением порядка и быстрым поиском по ключу. Теперь это можно делать с помощью обобщённого OrderedDictionary в .NET 9.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113🔥1
С неявными преобразованиями в Span<T> в .NET 10 теперь можно передавать массивы напрямую в методы, которые ожидают Span<T> или ReadOnlySpan<T>, без вызова .AsSpan(). Это делает высокопроизводительный код без аллокаций чище и безопаснее. Очень удобно

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😁4🔥21
Dictionary Expressions в C#?

Сейчас это предложение в статусе champion (ссылка ниже) и продолжение фичи Collection Expressions из C# 12.

Что думаете? 👎 или 👍

Предложение Dictionary Expressions

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40🥴9👎52🤔2
Большинство разработчиков используют Code-First или Database-First подход в EF Core.

Но немногие знают про Model-First

Database-First позволяет быстро сгенерировать модель из уже существующей базы.

Code-First даёт возможность строить базу данных из C#-классов и управлять схемой через миграции.

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

Есть более эффективный и современный вариант — Model-First.

Вместо ручного написания моделей и конфигураций вы проектируете их визуально.
Эти визуальные модели автоматически преобразуются в сущности EF Core и схемы базы данных.

Одним из лучших инструментов для Model-First является Entity Developer от Devart.

Он делает моделирование сущностей простым и удобным.
С помощью drag-and-drop интерфейса не нужно писать классы и вручную задавать связи.

– Меньше времени на шаблонный код и повторяющиеся конфигурации
– Быстрая генерация и обновление моделей по сравнению с ручным кодом
– Меньше риска ошибок рантайма из-за неверных маппингов или конфигураций
– Entity Developer генерирует корректный код и SQL-скрипты за вас

Вот гайд по тому, как именно это реализовать:

- Начало работы: создание EF Core модели для PostgreSQL
- Визуальное проектирование модели данных
- Генерация SQL-скриптов для PostgreSQL
- Автоматизация генерации кода EF Core
- Основные преимущества для разработки на EF Core + PostgreSQL

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥5👏1
Всё, что нужно, чтобы запустить реальный продукт

1. Аутентификация → [ASP .NET Core Identity]
2. База данных → [EF Core + SQL Server/PostgreSQL]
3. Платежи → [Stripe, PayPal]
4. Безопасность → [FluentValidation, OWASP]
5. Фронтенд → [Next.js + Shadcn/UI]
6. Бэкенд → [ASP .NET Core Web API]
7. Уведомления → [SendGrid, SignalR]
8. Наблюдаемость → [Application Insights, Serilog, OpenTelemetry]

Надёжный фундамент превращает идеи в работающие продукты.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍154
Какой способ пагинации лучше использовать?

Это зависит от данных.

Offset-пагинация используется по умолчанию: пропускаешь X строк, берёшь следующие Y.
Нормально для небольших выборок или неглубоких страниц, но чем дальше идёшь, тем медленнее работает.

Keyset (или cursor) пагинация лучше подходит для больших или часто обновляемых данных.

Вместо пропуска строк она «ищет» последнюю известную позицию (например, ID или timestamp) и оттуда достаёт следующую страницу.

Это быстрее, стабильнее и отлично работает для таких случаев, как:

- бесконечный скролл
- ленты активности
- почтовые ящики

Если делаешь что-то похожее, может помочь эта статья

А ты в своём проекте что используешь ?

offset - 👍 или keyset -❤️

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍138
Похоже, ты пропустил эти два типа коллекций.

Стоит о них знать, потому что…

Frozen collections — это новые коллекции, которые на 100% неизменяемы.

Но разве в .NET уже нет read-only и immutable коллекций?

Есть, но нюанс вот в чём…

Read-only коллекция может поменяться, если изменить исходную структуру данных.

Immutable коллекция при изменении создаёт новую копию оригинала с новыми значениями.

И вот тут проблема.

Frozen collections работают иначе.
После создания их изменить нельзя + у них вообще нет методов модификации.

На данный момент доступны только два типа:

- FrozenDictionary
- FrozenSet

Это абстрактные классы, их нельзя создать напрямую, как обычные Dictionary или Set.
Но можно использовать extension-методы.

Их стоит применять там, где коллекция редко создаётся, но часто используется.

Они оптимизированы под:

- быстрый доступ по ключу
- эффективное использование памяти
- потокобезопасность

Минус — более медленное создание.

Но, на мой взгляд, это вполне оправдано с учётом получаемых оптимизаций. Cогласны? 👍

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍185
Вот подробное руководство для C#-разработчиков по созданию и работе с серверами Model Context Protocol (MCP). Это практический материал для изучения MCP и интеграции AI-ассистентов в .NET-среде.

В .net 10 сервер MCP можно сделать за 20 строк кода — чек

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥1
Как сделать ежедневный отчёт и отправить его пользователям на почту?

Для этого можно использовать Coravel

Coravel — это библиотека для .NET без лишней конфигурации, вдохновлённая Laravel. Она добавляет в приложение фоновые задачи и автоматизацию, упрощая работу с бэкендом.

С помощью неё можно запускать задачи по расписанию, выполнять фоновые джобы в очереди, использовать invocables (классы фоновых задач), делать event broadcasting внутри процесса, рассылать письма и кешировать данные. Для всего этого не нужен ни брокер сообщений, ни база, ни внешние сервисы.

Конечно, Coravel не подойдёт для критически важных фоновых задач, где нужна надёжная персистентность или распределённая координация. Но как «ускоритель продуктивности» для .NET приложений — вполне рабочее решение.

Пробовал ли ты его? Ставь 👍 если да

Подробнее здесь: читать

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2👨‍💻2
Работаете с легаси-SQL в EF Core?

Хранимые процедуры, представления, странные джойны, которые не мапятся на ваши сущности?

Поддержка «сырого» SQL в EF Core сняла для меня большую боль.

Я просто объявляю простой POCO, пишу SQL и позволяю EF выполнить маппинг.

Никакой грязной конфигурации. Никакой ручной материализации.

И так как используются параметризованные запросы, это ещё и безопасно в плане SQL-инъекций.

Если вы работаете с легаси-базами, эта фича — спасение. 👍

Вот как этим пользоваться: тык

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Как кеш может работать неправильно?

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

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

Пробой кеша случается, когда ключа нет ни в кеше, ни в базе. Приложение не может обновить кеш и создаёт лишнюю нагрузку. В этом случае помогает кеширование null для несуществующих ключей или проверка ключа через bloom filter, чтобы лишний раз не обращаться к базе.

Есть и пробой по «горячему» ключу. Когда один популярный ключ истекает, вся нагрузка уходит в базу. Поскольку такие ключи могут составлять большую часть запросов, для них обычно не задают время жизни.

Кеш может и просто упасть. Тогда все запросы идут в базу, и система перестаёт справляться. Здесь выход либо в использовании circuit breaker, который блокирует обращения и к кешу, и к базе, либо в развёртывании кластера кеша, чтобы повысить его доступность.

А вы встречали такие ситуации в продакшене? 😱

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