en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

C# 1001 notes

C# 1001 notes

Open in Telegram

Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp

Show more
6 688
Subscribers
-324 hours
+67 days
+3830 days
Posts Archive
🧠 Polyglot Persistence: как современные системы живут с десятками баз данных 🔥 23 декабря в 20:00 мск — открытый вебинар в
🧠 Polyglot Persistence: как современные системы живут с десятками баз данных 🔥 23 декабря в 20:00 мск — открытый вебинар в OTUS. Одна база данных больше не справляется с требованиями современного мира. Сегодня компании вроде Avito, Yandex, Ozon и Spotify объединяют PostgreSQL, ClickHouse, Redis, Kafka, Elasticsearch и десятки других инструментов в единую экосистему, где каждая БД отвечает за свой кусочек производительности. 📌 На вебинаре разберём: — Принципы Polyglot Persistence и как распределять роли между СУБД — Как связать PostgreSQL, ClickHouse, Redis и Kafka без потери согласованности — Как работают event-driven архитектуры, CDC и outbox-паттерн в боевых системах — Как проектировать отказоустойчивые data-платформы Регистрация https://otus.pw/enVW/?erid=2W5zFHSfqbE Бесплатное занятие приурочено к старту курса Highload Architect, где вы научитесь проектировать системы, выдерживающие миллионы запросов. Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🚦 Feature Flags в .NET - как управлять релизами без redeploy Feature flags (фиче-флаги) позволяют включать и выключать функц
🚦 Feature Flags в .NET - как управлять релизами без redeploy Feature flags (фиче-флаги) позволяют включать и выключать функциональность на лету, без повторного деплоя и риска для продакшена. Идея простая: код задеплоен → поведение управляется конфигурацией. Что это даёт на практике: — Постепенные релизы Можно включить новую фичу сначала для 1%, 10% или конкретной группы пользователей. — Быстрый rollback Если что-то пошло не так — просто выключаете флаг. Без откатов и срочных хотфиксов. — A/B тесты Разные пользователи получают разное поведение одного и того же кода. — Targeting пользователей Фичи можно включать: • по user id • по роли • по региону • по environment (dev / staging / prod) — Меньше фиче-веток Код живёт в main, а не за флагами в git. В .NET обычно используют: - Microsoft.FeatureManagement - Azure App Configuration - LaunchDarkly / Unleash / ConfigCat Где это особенно полезно: - публичные API - high-traffic сервисы - SaaS-продукты - экспериментальные и рискованные фичи Коротко: Feature flags превращают релиз из «одного опасного момента» в управляемый процесс. Это один из самых мощных инструментов для зрелой backend-архитектуры. 👉 Подробнее

Крутая статья - «Building an Event Queue in ASP.NET Core» от Deepumi. 🔹 Она показывает, как правильно построить очередь собы
Крутая статья - «Building an Event Queue in ASP.NET Core» от Deepumi. 🔹 Она показывает, как правильно построить очередь событий внутри ASP.NET Core-приложения: • использовать встроенные механизмы (middleware / DI) • распределять события между обработчиками • обрабатывать события асинхронно и надёжно 🔹 Такая архитектура помогает: • реализовать decoupled компоненты, которые не знают друг о друге • централизовать событие-поток (логика, оповещения, триггеры и т.п.) • легче масштабировать и тестировать код Если работаешь с ASP.NET Core и хочешь сделать систему событий - стоит заглянуть. Подробнее: deepumi.com/blog/building-an-event-queue-in-aspnet-core.html

💻 Асинхронная обработка данных в высоконагруженных системах 🚀 🔥 16 декабря в 20:00 мск — открытый урок в OTUS. 📌 На вебин
💻 Асинхронная обработка данных в высоконагруженных системах 🚀 🔥 16 декабря в 20:00 мск — открытый урок в OTUS. 📌 На вебинаре вы узнаете: — Как использовать асинхронную обработку данных для масштабирования сервисов — Как работают очереди сообщений, веб-сокеты и другие инструменты асинхронного взаимодействия — Как выглядит архитектура реального проекта: от веб-сервера до брокера сообщений и базы данных — Какие узкие места чаще всего встречаются в асинхронных системах и как их устранять 🎓 После занятия вы: — Разберётесь в принципах асинхронной архитектуры и её влиянии на производительность — Научитесь применять асинхронные подходы — Получите реальные примеры архитектурных решений 👉 Регистрация https://otus.pw/Ayxv/?erid=2W5zFJbb2u6 Бесплатный урок приурочен к старту курса Highload Architect, на котором вы освоите архитектуры, выдерживающие миллионы запросов в секунду, и научитесь проектировать системы без узких мест. 🚀 Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🚀 .NET 10 - реально мощный релиз. Вот что важно знать 👇 .NET 10 и C# 14 вышли 11 ноября 2025 года. Это LTS-версия - поддерж
+7
🚀 .NET 10 - реально мощный релиз. Вот что важно знать 👇 .NET 10 и C# 14 вышли 11 ноября 2025 года. Это LTS-версия - поддержку будут выпускать до ноября 2028 года, поэтому её можно спокойно брать для продакшна. 🔥 Главное ✔ C# 14 Новый синтаксис и возможности языка: • Extension Members — расширения прямо в типах • Null-Conditional Assignment - безопасные присваивания • field keyword — точный контроль над авто-свойствами • Модификаторы у параметров лямбд • Частичные конструкторы и события ✔ File-Based Apps Теперь можно просто создать один .cs файл и запускать приложение - без .sln, без .csproj. Быстро, просто, удобно. ✔ ASP.NET Core • Валидация в Minimal APIs • JSON Patch • SSE (Server-Sent Events) • Поддержка OpenAPI 3.1 ✔ EF Core • Complex Types можно делать optional • JSON и struct внутри Complex Types • LeftJoin / RightJoin • Named Query Filters • ExecuteUpdate работает с JSON-колонками • В ExecuteUpdate теперь можно использовать обычные лямбды Полный гайд здесь: ↳ https://antondevtips.com/blog/new-features-in-dotnet-10-and-csharp-14/?utm_source=twitter&utm_medium=social&utm_campaign=04-12-2025

✔️ Delegating Handlers в .NET: как правильно добавлять сквозную логику для HttpClient DelegatingHandler - это удобный способ
✔️ Delegating Handlers в .NET: как правильно добавлять сквозную логику для HttpClient DelegatingHandler - это удобный способ внедрять сквозную логику в каждый HTTP-запрос: авторизацию, логирование, метрики, ретраи и любые другие политики, не трогая основной код. Пример обработчика аутентификации: - добавляет заголовок Authorization - подставляет корректный User-Agent - затем передаёт управление следующему звену конвейера Это позволяет централизованно контролировать конфигурацию запросов и избегать дублирования логики во всех сервисах. Подходит для чистой архитектуры, микросервисов и SDK, где важна единообразная обработка запросов.

⚡️ Полезное о блокировках в C#. Многие собеседования заваливаются именно здесь. Коротко по сути: lock не работает в `async`-м
⚡️ Полезное о блокировках в C#. Многие собеседования заваливаются именно здесь. Коротко по сути: lock не работает в `async`-методах. Причина проста — выполнение может продолжиться на другом потоке, и гарантии взаимного исключения теряются. Что использовать вместо `lock` в асинхронном коде: - SemaphoreSlim — основной вариант - Semaphore - Mutex - Monitor (в синхронных сценариях) Правильный шаблон: 1. Всегда используйте таймаут, чтобы избежать зависаний. 2. Освобождайте ресурс в `finally`, иначе возможна утечка блокировки. Примерный подход: - попытаться войти с ограничением времени - выполнить критическую секцию - гарантированно освободить семафор Почему это важно: В многопоточном и распределённом окружении неправильная синхронизация приводит к гонкам, дублированию запросов, «штормам» в кеше и нагрузке на внешний API. Вопрос для практики: Как реализовать блокировку на уровне базы данных, чтобы синхронизировать несколько инстансов приложения? Ответ — в разборе по distributed locking: milanjovanovic.tech/blog/distributed-locking-in-dotnet-coordinating-work-across-multiple-instances

🖥 Directory.Build.props - простой способ задать единые настройки для всей .NET-солюции. Вместо того чтобы дублировать конфиг
🖥 Directory.Build.props - простой способ задать единые настройки для всей .NET-солюции. Вместо того чтобы дублировать конфигурацию в каждом .csproj, ты создаёшь один файл в корне и управляешь всем централизованно: версия языка, уровни предупреждений, Nullable, ImplicitUsings, Deterministic-сборки и даже версии NuGet-пакетов. Подходит, если хочешь порядок в проектах и одинаковые правила для всей команды.

Коллекции .NET: взгляд изнутри Как устроены стандартные коллекции в .NET и почему понимание их внутренней логики помогает пис
Коллекции .NET: взгляд изнутри Как устроены стандартные коллекции в .NET и почему понимание их внутренней логики помогает писать более производительный код? На открытом вебинаре курса OTUS «C# Developer. Advanced» Антон Герасименко покажет, что происходит «под капотом» List, Dictionary и других структур данных. 📆 4 декабря, 20:00 Коллекции .NET: взгляд изнутри: — разберём устройство стандартных коллекций — заглянем в исходный код и объясним, почему они работают именно так — обсудим, когда стоит реализовать собственную структуру данных Вебинар будет полезен разработчикам уровня Junior и выше, которые хотят глубже понимать, как устроены базовые механизмы .NET и как использовать их эффективнее. 👉Зарегистрируйтесь: https://otus.pw/esShq/?erid=2W5zFGumrxg Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

«Обзор нововведений в C# 14» Статья от PVS-Studio на Хабре описывает, что именно добавили в C# 14 и как эти изменения делают код чище и короче. 1. Ключевое слово field Теперь в сеттере свойства можно обращаться к скрытому полю без его явного объявления. Это уменьшает шаблонный код и делает свойства компактнее. Пример было:

private string _email;
public string Email
{
  get => _email;
  set => _email = value.Trim();
}
Пример стало:


public string Email
{
  get;
  set => field = value.Trim();
}
Лямбды с модификаторами без указания типа Если в параметрах используются ref, out, in, теперь можно не писать тип. Это улучшает читаемость и уменьшает шум. Было:


(value, out string error) => ...
Стало:

(value, out error) => ...
Перегрузка операторов составного присваивания (+=, -=, *=, /=) Теперь такие операторы можно перегружать напрямую, а не через комбинацию бинарного оператора и присваивания. Это делает пользовательские типы более естественными и управляемыми. nameof для открытых обобщённых типов Теперь можно писать:


nameof(List<>)
Это полезно при генерации кода, рефлексии и работе с API, где нужны именно открытые generics. C# 14 - небольшое, но важное обновление языка, направленное на упрощение синтаксиса и уменьшение шаблонного кода. Наиболее заметные улучшения - field и новые правила для лямбд.

🧩 Борьба с блокировками в PostgreSQL: как достичь высокой параллельности при большой нагрузке 🚀 🔥 2 декабря в 20:00 мск —
🧩 Борьба с блокировками в PostgreSQL: как достичь высокой параллельности при большой нагрузке 🚀 🔥 2 декабря в 20:00 мск — открытый урок в OTUS. 📌 На вебинаре рассмотрим: — Почему возникают блокировки и как они влияют на скорость работы базы данных— Типы блокировок в PostgreSQL и их особенности на уровне транзакций и строк — Как находить узкие места, анализировать ожидания и устранять deadlock-и — Методы оптимизации запросов и транзакций для повышения параллельности — Архитектурные приёмы и практики проектирования систем с высокой конкурентностью 🎓 После урока вы: — Поймёте, как устроен механизм блокировок и научитесь управлять ими осознанно — Научитесь диагностировать и устранять конфликты между транзакциями — Получите набор практических решений по оптимизации PostgreSQL под нагрузкой — Сможете спроектировать архитектуру, обеспечивающую высокую стабильность и масштабируемость 👉 Регистрация https://otus.pw/k3A0/?erid=2W5zFHrYhVa Бесплатное занятие приурочено к старту курса Highload Architect, на котором вы освоите подходы к построению производительных архитектур, готовых к тысячам запросов в секунду. Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

⚡️ Полное руководство по Bash: от основ к продвинутым темам Bash (Bourne Again SHell) — это одна из самых популярных Unix-обо
⚡️ Полное руководство по Bash: от основ к продвинутым темам Bash (Bourne Again SHell) — это одна из самых популярных Unix-оболочек, широко используемая для запуска команд и написания скриптов в Linux и macOS. Скрипты Bash позволяют автоматизировать рутинные задачи, объединять команды в программы и управлять системой через командную строку. Данное руководство последовательно познакомит вас с основами Bash (синтаксис, переменные, условия, циклы и т.д.), а затем перейдет к продвинутым возможностям (таким как настройка strict mode, использование trap-обработчиков, планирование задач через cron и др.). Мы рассмотрим практические примеры скриптов, сопровождая их поясняющими комментариями, чтобы у вас сложилось цельное понимание создания надежных Bash-скриптов. https://uproger.com/polnoe-rukovodstvo-po-bash-ot-osnov-k-prodvinutym-temam/ Видео: https://www.youtube.com/watch?v=ei0a1TT4ukU

Реактивное программирование в C# Advanced: сложные операторы, обработка ошибок и холодные/горячие Observable Асинхронность в
Реактивное программирование в C# Advanced: сложные операторы, обработка ошибок и холодные/горячие Observable Асинхронность в C# может быть простой, если знать, как с ней работать правильно. На открытом вебинаре курса OTUS C# Developer. Advanced Елена Сычева покажет, как реактивное программирование помогает избавиться от Callback Hell и писать код, который сам реагирует на данные и события. 📌 26 ноября, 20:00 Реактивное программирование в C# Advanced — продвинутые операторы Rx.NET: Switch, GroupBy, Buffer, Throttle — устойчивые к сбоям системы: Catch, Retry, Finally — холодные и горячие Observable: Publish, Replay, RefCount — управление подписками и жизненным циклом реактивных компонентов Вебинар будет полезен разработчикам на C#, работающим с асинхронным кодом, потоками данных и событиями. Участники узнают, как проектировать реактивные системы, способные восстанавливаться после ошибок, и писать декларативный, читаемый и эффективный код. 👉 Зарегистрируйтесь: https://otus.pw/kdEI/?erid=2W5zFJeYfSx Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

ASP .NET 10 получил новую возможность — Server-Sent Events (SSE) В свежем ASP .NET 10 появилась поддержка Server-Sent Events
ASP .NET 10 получил новую возможность — Server-Sent Events (SSE) В свежем ASP .NET 10 появилась поддержка Server-Sent Events — современного способа стримить данные в браузер без WebSockets. Что такое SSE - Односторонний канал: сервер → браузер - Идеально подходит для потоковых обновлений, логов, нотификаций, live-данных - Работает поверх обычного HTTP, без сложной настройки протокола Почему это круто - Проще, чем WebSockets - Легче масштабировать - Отлично подходит для real-time интерфейсов и hypermedia-приложений - Встроено прямо в ASP .NET 10, без сторонних библиотек Это может стать большим шагом для разработки динамичных и интерактивных UI — особенно там, где нужен непрерывный поток данных, но WebSockets избыточны. #dotnet #aspnet #csharp #backend #webdev

Один навык сделает вас ценным в любой команде — умение находить и устранять узкие места производительности. Скорость приложен
Один навык сделает вас ценным в любой команде — умение находить и устранять узкие места производительности. Скорость приложения — это не просто «хорошо иметь». Это деньги, стабильность и доверие пользователей. И чем больше система, тем больнее становятся проблемы с производительностью. В микросервисной архитектуре это особенно заметно: запросы ходят между сервисами, сетевые задержки накапливаются, логика размазана — и понять, где именно тормозит, становится значительно труднее. Почему так происходит? - распределённая архитектура усложняет путь запроса - один медленный сервис замедляет десяток других - локально всё работает быстро, а в продакшене исчезает производительность - классические логи дают только фрагменты картины Но есть хороший инструмент, который решает эту проблему — трейсинг с OpenTelemetry. Он позволяет пройти вместе с запросом через всю цепочку сервисов и увидеть, где именно начинается задержка. Это настоящий рентген системы. Если вы хотите внедрить распределённый трейcинг, автор подготовил пошаговый гайд, который можно адаптировать под любой .NET-проект. Вот отличная отправная точка: milanjovanovic.tech/blog/introduction-to-distributed-tracing-with-opentelemetry-in-dotnet

⚡ Быстрый совет для Cursor Хочешь, чтобы Cursor писал точнее и в твоём стиле? 🧠 Просто создай файл `.cursorrules` в корне пр
⚡ Быстрый совет для Cursor Хочешь, чтобы Cursor писал точнее и в твоём стиле? 🧠 Просто создай файл `.cursorrules` в корне проекта и опиши в нём: - правила кодстайла, которые ты используешь - предпочтения по структуре, форматированию, именованию Чем конкретнее, тем лучше работает автогенерация. 🔥 Это помогает избежать «галлюцинаций» и потери контекста при создании кода.

⚡️ Когда стоит применять паттерн Idempotent Consumer? В распределённых системах всё непредсказуемо: сообщения могут прийти по
+2
⚡️ Когда стоит применять паттерн Idempotent Consumer? В распределённых системах всё непредсказуемо: сообщения могут прийти поздно, в неправильном порядке или продублироваться. Если надеяться, что каждое сообщение обработается «строго один раз», рано или поздно появятся тихие ошибки в данных. Производитель может частично решить проблему: многие брокеры (Azure Service Bus, Amazon SQS) сами отбрасывают дубликаты, если у сообщения есть уникальный MessageId. Но у потребителя ответственность больше. Паттерн Idempotent Consumer предотвращает повторные побочные эффекты: 1. Перед обработкой проверяем локальную таблицу с ключом (MessageId, ConsumerName). 2. Если записи нет - выполняем логику, коммитим транзакцию и записываем факт обработки. 3. Если запись уже есть - сообщение повторное, просто выходим. Что делать с внешними сервисами? Некоторые поддерживают idempotency key (например, email-сервисы), и тогда повторный запрос просто игнорируется. Если сервис это не умеет, можно сохранять намерение локально и выполнять действие отдельным надёжным процессом. Важно: не все обработчики нуждаются в этом паттерне. Если операция сама по себе безопасна при повторе (обновить статус, пересобрать кэш) — дополнительные проверки не нужны. Используйте Idempotent Consumer там, где повторное выполнение может привести к деньгам, ошибкам или сбоям в бизнес-логике. milanjovanovic.tech/blog/the-idempotent-consumer-pattern-in-dotnet-and-why-you-need-it

Управление зависимостями в ASP.NET Core: меньше рутины, больше автоматизации. Ручное добавление сервисов через AddScoped и Ad
Управление зависимостями в ASP.NET Core: меньше рутины, больше автоматизации. Ручное добавление сервисов через AddScoped и AddSingleton превращает Program.cs в бесконечный список регистраций. Но есть способ проще — библиотека Scrutor. На открытом вебинаре курса OTUS C# ASP.NET Core разработчик Михаил Дмитриев покажет, как автоматизировать регистрацию сервисов и расширить стандартный IoC контейнер. 📌 18 ноября, 20:00 Управление зависимостями в ASP.NET Core с помощью Scrutor — массовая регистрация сервисов по правилам — использование паттерна декоратор — добавление кэширования без переписывания кода — реальные примеры для продакшн-проектов Вебинар бесплатный и будет полезен ASP.NET Core-разработчикам, которые хотят упростить настройку зависимостей и сделать код чище. 👉 Регистрируйтесь: https://otus.pw/HpwY/?erid=2W5zFJ5eURW Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

🖥 Полезный Совет по Visual Studio: Когда вы создаете метод, который возвращает JSON через raw string literal, добавьте /* la
🖥 Полезный Совет по Visual Studio: Когда вы создаете метод, который возвращает JSON через raw string literal, добавьте /* lang=json*/ Этот момент нигде не задокументирован. Если в JSON будет синтаксическая ошибка вроде пропущенной запятой, Visual Studio подсветит её.