C# 1001 notes
前往频道在 Telegram
Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого. admin - @haarrp
显示更多6 688
订阅者
-324 小时
+67 天
+3830 天
帖子存档
6 689
⚙️ Утилиты для асинхронного программирования в .NET
Если ты работаешь с
async/await и хочешь писать более чистый, безопасный и удобный код — попробуй AsyncEx.
Это мощная библиотека с готовыми асинхронными инструментами:
🔒 AsyncLock — асинхронный мьютекс: синхронизирует доступ к ресурсу *без блокировки потока*.
🚦 AsyncSemaphore — ограничивает количество одновременно выполняющихся задач, но *в асинхронной манере*.
📦 AsyncLazy — отложенная инициализация, которая запускается только при первом вызове. Работает в `async`-контексте.
📡 AsyncConditionVariable — асинхронная переменная состояния: удобно ожидать/уведомлять задачи о смене состояния ресурса.
📣 AsyncEvent — асинхронные события: подписка и вызов обработчиков без блокировки.
🧰 TaskHelper — утилиты для работы с задачами: ожидание, отмена, управление результатами.
🚀 Как начать?
Просто установи через NuGet:
https://github.com/StephenCleary/AsyncEx6 689
💻 Мониторинг в высоконагруженных проектах 🔧
🔥 12 августа в 20:00 мск — открытый вебинар в OTUS.
На вебинаре рассмотрим:
- Почему мониторинг — ключ к стабильности высоконагруженных систем?
- Методы и инструменты мониторинга, подходящие для проектов с высокой нагрузкой.
- Как настроить и оптимизировать мониторинг для выявления и предотвращения проблем.
- Как эффективно использовать метрики и логи для улучшения производительности.
- Реальные кейсы мониторинга в сложных системах.
🎓 После вебинара вы:
- Научитесь правильно настраивать мониторинг для высоконагруженных проектов.
- Узнаете, как использовать данные мониторинга для повышения производительности и стабильности систем.
- Получите практические рекомендации по оптимизации мониторинга.
🔧 Присоединяйтесь, чтобы научиться отслеживать и поддерживать стабильность систем, работающих под высокой нагрузкой!
🎁Все участники получат шаблон развертывания кластера RabbitMQ
👉 Регистрация https://otus.pw/2yrT/?erid=2W5zFJQ6ube
Бесплатное занятие приурочено к старту курса Highload Architect
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 689
🧰 .NET Community Toolkit — полезная коллекция библиотек и API для .NET-разработчиков, созданная Microsoft и поддерживаемая сообществом. Этот набор инструментов не привязан к конкретному UI-фреймворку, а значит, его можно использовать в любых проектах — от десктопных приложений до веб-решений.
Среди ключевых компонентов — CommunityToolkit.Mvvm (облегченная MVVM-библиотека, наследник MvvmLight), CommunityToolkit.HighPerformance (оптимизации для работы с памятью и многопоточностью) и CommunityToolkit.Diagnostics (удобные методы валидации). При этом все инструменты уже применяются в реальных продуктах Microsoft, включая новый Microsoft Store.
Разработчики могут легко подключить NuGet-пакеты через Visual Studio, а документация доступна на Microsoft Docs. Планы по развитию публикуются в Roadmap, а для тестирования новых функций можно подключить пререлизные сборки.
🤖 GitHub
6 689
На E-CODE одно из фокусных направлений — C#. Доклады экспертов на главном IT-событии осени будут в треке Backend 💙
Заходите смотреть программу и регистрироваться — места улетают стремительно.
Успех ждёт middle+ инженеров — команда Ozon Tech собирает в пространстве E-CODE профессиональное комьюнити. Общаться, меняться опытом и контактами, находить идеи и своё место в этом большом мире IT.
Или хотя бы у сцены — в лайнапе E-CODE НТР, Заточка, ILWT и Нейромонах Феофан.
E-CODE — событие, на котором вам стоит побывать.
Зарегистрироваться. ⬅
6 689
🔥 Лучшая фича в ASP .NET Core 10 — Server-Sent Events (SSE)
SSE — это упрощённая альтернатива SignalR: стриминг данных с сервера к клиенту через обычный HTTP.
🔑 Плюсы SSE:
➡️ Односторонняя передача: только сервер → клиент
➡️ Работает через обычный HTTP (тип `text/event-stream`)
➡️ Не требует WebSocket-рукопожатия
➡️ Браузеры автоматически переподключаются
➡️ Очень низкие накладные расходы
🧪 Можно тестировать прямо через
curl, Postman, Apidog, или HTTP request-файлы в IDE. Поддерживается во всех основных браузерах.
📌 Когда использовать SSE:
☑️ Лайв-ленты: акции, спорт, новости
☑️ Реальные уведомления: соцсети, алерты
☑️ Отслеживание прогресса: загрузки, долгие операции
☑️ Лайв-дэшборды: мониторинг, аналитика
SSE идеально подходит, когда нужно пушить данные с сервера, но не нужен full-duplex как в WebSockets.
📦 Я сделал пример — Live Stock Market с исходниками для фронта и бэка. Пиши, если интересно!6 689
🔍 Anton DevTips делится 650+ эксклюзивными бесплатными материалами для прокачки C#, .NET, ASP .NET Core, EF Core и микросервисов:
Отдельные статьи и примеры из подборки:
- Structured Logging & Distributed Tracing в микросервисах
↳ https://antondevtips.com/blog/how-to-implement-structured-logging-and-distributed-tracing-for-microservices-with-seq
- Server-Sent Events в ASP .NET Core 10
↳ https://antondevtips.com/blog/real-time-server-sent-events-in-asp-net-core
- Логирование API-запросов и ответов
↳ https://antondevtips.com/blog/logging-requests-and-responses-for-api-requests-and-httpclient-in-aspnetcore
- GraphQL c HotChocolate
↳ https://antondevtips.com/blog/getting-started-with-hot-chocolate-graphql
- WebAPI на FastEndpoints + Vertical Slice
↳ https://antondevtips.com/blog/productive-web-api-development-with-fast-endpoints-and-vertical-slice-architecture-in-dotnet
- AI-чат-бот на OpenAI + Postgres
↳ https://antondevtips.com/blog/building-multimodel-ai-chat-bot-in-dotnet-with-chat-gpt-and-database-branching-in-neon-postgres
- Мультитенант в Azure Functions
↳ https://antondevtips.com/blog/building-a-multitenant-cloud-application-with-azure-functions-and-neon-postgres
- Snapshot-тестирование с Verify
↳ https://antondevtips.com/blog/how-to-simplify-assertions-in-unit-and-integration-tests-with-verify-in-dotnet
- Интеграционные тесты c WireMock
↳ https://antondevtips.com/blog/how-to-test-integrations-with-apis-using-wiremock-in-dotnet
- Best Practices для ASP .NET Core Integration Testing
↳ https://antondevtips.com/blog/asp-net-core-integration-testing-best-practises?utm_source=linkedin&utm_medium=social&utm_campaign=01-04-2025
- MongoDB + .NET: практики
↳ https://antondevtips.com/blog/best-practices-when-working-with-mongodb-in-dotnet
- CLI-приложения на .NET
↳ https://antondevtips.com/blog/how-to-create-command-line-console-applications-in-dotnet
- Кастомизация ASP .NET Core Identity
↳ https://antondevtips.com/blog/how-to-customize-aspnet-core-identity-with-efcore-for-your-project-needs
- Миграции для нескольких БД в EF Core
↳ https://antondevtips.com/blog/how-to-create-migrations-for-multiple-databases-in-ef-core
- Управление жизненным циклом DbContext
↳ https://antondevtips.com/blog/how-to-manage-ef-core-dbcontext-lifetime
- Views, Stored Procedures и Functions в EF Core
↳ https://antondevtips.com/blog/calling-views-stored-procedures-and-functions-in-ef-core
✔️ PDF-сборник ресурсов — docs, туториалы, блоги, видео
↳ https://anton-devtips.kit.com/dotnet-resources?utm_source=linkedin&utm_medium=social&utm_campaign=dotnet-resources-july-2025
6 689
🧼 Как элегантно работать с конфигами в .NET?
Раньше я просто тянул значения напрямую из
IConfiguration.
Это быстро надоедает: много повторений, легко ошибиться, сложно валидировать.
Сейчас всегда использую Options pattern — и вот почему:
✅ Привязываешь конфигурацию к строго типизированным классам
✅ Добавляешь валидацию через аннотации
✅ Чисто внедряешь настройки через DI (`IOptions<T>` или `IOptionsSnapshot<T>`)
Отлично работает для:
- appsettings.json
- фичефлагов
- конфигов внешних сервисов
Если хочешь чистый и масштабируемый код — лучше подхода пока нет.6 689
🔥 𝟮𝟬 Полезных статей для изучения ASP.NET Core
1. Как заменить исключения на Result-паттерн
↳ https://antondevtips.com/blog/how-to-replace-exceptions-with-result-pattern-in-dotnet
2. Как логировать запросы и ответы API
↳ https://antondevtips.com/blog/logging-requests-and-responses-for-api-requests-and-httpclient-in-aspnetcore
3. Как реализовать refresh-токены и отзыв токенов
↳ https://antondevtips.com/blog/how-to-implement-refresh-tokens-and-token-revocation-in-aspnetcore
4. Как создавать и конвертировать PDF-документы
↳ https://antondevtips.com/blog/how-to-create-and-convert-pdf-documents-in-aspnetcore
5. Как писать собственные middleware
↳ https://antondevtips.com/blog/how-to-create-custom-middlewares-in-asp-net-core
6. Серверные события в реальном времени (SSE)
↳ https://antondevtips.com/blog/real-time-server-sent-events-in-asp-net-core
7. Лучшие практики аутентификации и авторизации
↳ https://antondevtips.com/blog/authentication-and-authorization-best-practices-in-aspnetcore
8. Лучший способ маппинга объектов
↳ https://antondevtips.com/blog/the-best-way-to-map-objects-in-dotnet-in-2024
9. Лучший способ валидации объектов
↳ https://antondevtips.com/blog/the-best-way-to-validate-objects-in-dotnet-in-2024
10. Паттерн Options и работа с конфигурацией
↳ https://antondevtips.com/blog/master-configuration-in-asp-net-core-with-the-options-pattern
11. Как повысить производительность Web API
↳ https://antondevtips.com/blog/how-to-increase-performance-of-web-apis-in-dotnet
12. 15 типичных ошибок при создании Web API
↳ https://antondevtips.com/blog/top-15-mistakes-developers-make-when-creating-web-apis
13. Как реализовать кэширование
↳ https://antondevtips.com/blog/how-to-implement-caching-strategies-in-dotnet
14. Быстрый старт с FastEndpoints
↳ https://antondevtips.com/blog/getting-started-with-fastendpoints-for-building-web-apis-in-dotnet
15. Деплой приложений .NET в Azure через Aspire
↳ https://antondevtips.com/blog/how-to-deploy-dotnet-application-to-azure-using-neon-postgres-and-dotnet-aspire
16. 15 ошибок, которые совершают .NET-разработчики
↳ https://antondevtips.com/blog/top-15-mistakes-dotnet-developers-make-how-to-avoid-common-pitfalls
17. Лучшие практики повышения качества кода
↳ https://antondevtips.com/blog/best-practices-for-increasing-code-quality-in-dotnet-projects
18. Как создать мультиарендное приложение
↳ https://antondevtips.com/blog/how-to-implement-multitenancy-in-asp-net-core-with-ef-core
19. Архитектура на основе вертикальных срезов
↳ https://antondevtips.com/blog/vertical-slice-architecture-the-best-ways-to-structure-your-project
20. Как структурировать проект с Clean Architecture + Vertical Slices
↳ https://antondevtips.com/blog/the-best-way-to-structure-your-dotnet-projects-with-clean-architecture-and-vertical-slices
📥 Скачать дорожную карту по ASP.NET Core на 2025 год:
↳ https://antondevtips.com/roadmap/aspnetcore?utm_source=linkedin&utm_medium=social&utm_campaign=aspnetcore-roadmap-2025
6 689
🧠 Задача: "Сколько раз выполнится блок Console.WriteLine?"
public class Program
{
public static void Main()
{
var obj = new Counter();
for (int i = 0; i < 3; i++)
{
Console.WriteLine(obj++);
}
}
}
public class Counter
{
private int _value = 0;
public static Counter operator ++(Counter c)
{
c._value++;
return c;
}
public static implicit operator int(Counter c)
{
return c._value;
}
}
❓Вопрос:
Что выведет программа?
🔍 Разбор:
На первый взгляд кажется, что программа выведет:
1
2
3
📎 Но на самом деле она выведет:
0
1
2
Почему?
Оператор obj++ — это постфиксный инкремент. Он:
сначала вызывает implicit operator int для текущего значения,
а затем вызывает operator ++.
То есть порядок такой:
Console.WriteLine(obj++) вызывает implicit int до инкремента
только потом ++ увеличивает значение.
✅ Что это проверяет:
Знание порядка вызова операторов (++ и implicit)
Понимание поведения постфиксных операций в .NET
Умение читать и анализировать перегрузки операторов
@csharp_1001_notes6 689
Хотите разобраться в тестировании API на ASP.NET Core?
➡️ Присоединяйтесь к открытому уроку «Тестирование API в ASP.NET Core: Интеграция и Нагрузка» 5 августа в 20:00 МСК. На вебинаре мы:
- Разберем ключевые концепции интеграционного и нагрузочного тестирования.
- Научимся писать интеграционные тесты с популярными библиотеками.
- Освоим инструменты для нагрузочного тестирования и анализа результатов.
📗 Этот урок — отличная подготовка к курсу «C# ASP.NET Core разработчик», который стартует совсем скоро. Все участники вебинара получат скидку на обучение!
Записаться на вебинар → https://otus.pw/sqqO/?erid=2W5zFHob1Sg
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 689
Правильный способ построения асинхронных API в .NET
Большинство API работают по простому шаблону:
🔸Клиент отправляет запрос
🔸Сервер выполняет работу
🔸Сервер возвращает ответ
Такой подход отлично работает для быстрых операций — например, получения данных или простых обновлений.
А что насчёт длительных операций?
Речь о задачах вроде:
> обработки больших файлов
> генерации отчётов
> конвертации видео
Такие процессы могут занимать от нескольких минут до часов.
Вот как можно правильно строить асинхронные API: читать
Как сообщить клиенту, что его запрос обработан?
Есть два подхода:
🔸PULL — клиент опрашивает API, чтобы узнать статус
🔸PUSH — сервер сам уведомляет клиента (через WebSocket, email и т.д.)
6 689
Рефлексия тормозит приложения? Пора управлять компилятором!
Устали писать одинаковый код снова и снова? Рефлексия съедает производительность в рантайме, а генерация boilerplate-кода отнимает часы. Современный C# предлагает элегантное решение — заставить компилятор работать на вас.
🎥 Вебинар «Заставьте компилятор работать на вас: магия метапрограммирования с Source Generators в C#»
📅 6 августа, 20:00
👩🏫 Елена Сычева
Разберём на практике:
→ Почему рефлексия — узкое место и как Source Generators решают проблему на этапе компиляции
→ Устройство компилятора Roslyn: синтаксические деревья и семантическая модель
→ Live-coding первого Source Generator для избавления от рутинного кода
→ Применение генераторов в популярных библиотеках .NET 7+
Результат: вы научитесь создавать собственные генераторы кода, которые автоматизируют рутину и повышают производительность приложений без runtime-накладных расходов.
Вебинар проходит в рамках курса «C# углубленный» — участники получают эксклюзивные условия обучения.
→ Регистрация: https://otus.pw/X1GN/
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ", ИНН: 9705100963
6 689
Почти каждый разработчик допускал эту ошибку.
Что не так с этим кодом?
На первый взгляд всё кажется логичным:
🔸API-эндпоинт регистрации пользователя вызывает
UserService
🔸UserService сохраняет пользователя в базу и вызывает EmailService
🔸EmailService через SmtpClient отправляет письмо
Но если присмотреться, метод SendWelcomeEmail объявлен как async void.
В чём проблема с async void?
Вот суть:
❌ async void делает невозможным отлов исключений.
Если внутри SendEmailAsync() произойдёт исключение — catch его не перехватит.
Вместо этого приложение может тихо упасть или начать вести себя непредсказуемо.
Почему так происходит?
Методы async void не возвращают Task, поэтому вызывающий код не может их await-ить и обрабатывать ошибки.
Исключения из async void проходят мимо стандартных механизмов обработки.
Правильный подход:
✅Всегда возвращай Task
Запомни: async void допустим только для обработчиков событий, где возвращаемый void обязателен.6 689
😈 Хитрая задачка на C# — замыкания и ловушка в цикле
Что выведет этот код?
var actions = new List<Action>();
for (int i = 0; i < 5; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action();
}
На первый взгляд кажется, что будет:
0
1
2
3
4
Но на самом деле вывод:
5
5
5
5
5
💡 Почему?
Все лямбды замкнулись на одну и ту же переменную i, и когда они выполняются — i уже стало 5.
✅ Как исправить:
for (int i = 0; i < 5; i++)
{
int copy = i;
actions.Add(() => Console.WriteLine(copy));
}
Теперь всё работает как ожидается.
🧠 Замыкания в C# захватывают переменные, а не их значения! Аккуратнее с циклами и лямбдами.6 689
😱💻 Хотите прокачать архитектурные скилы и стать востребованным fullstack-разработчиком?
Пройдите вступительный тест и получите бесплатные уроки курса «C# ASP.NET Core разработчик» от OTUS!
👉 Пройти тест: https://otus.pw/gmbX/
🚀 Зарядите карьеру: увеличьте доход, берите сложные проекты и работайте с современным стеком!
Всего за 6 месяцев вы научитесь:
• Разрабатывать веб-приложения на ASP.NET Core, рассматривая ASP.NET подробно, со всеми его механизмами
• Создавать различные технологии межсервисного взаимодействия + реалтайм с клиентским приложением
•Интегрировать фронтенд (ReactJS + JavaScript+Typescript) с бэкендом
• Тестировать приложения: интеграционные и нагрузочные тесты
• Автоматизировать процессы с CI/CD и Kubernetes
• Проектировать микросервисы и освоить event-driven архитектуру
🎁 Бонус: После теста — доступ к урокам!
👉 Проверьте свои силы прямо сейчас: https://otus.pw/gmbX/?erid=2W5zFJd7K3v
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 689
🔥 .NET Aspire: как упростить Service Discovery в микросервисах
Вместо ручной настройки адресов и портов, фреймворк .NET Aspire позволяет упростить обнаружение сервисов с помощью декларативного подхода.
🔹 Конфигурация через
.AddProject() и .WithReference()
🔹 Сервисы автоматически "обнаруживаются" и подключаются
🔹 Поддержка локальной разработки, контейнеров и облака
🔹 Логи, метрики, health checks — встроены
📌 Aspire — это не просто упрощение разработки, это фундамент для масштабируемых .NET-приложений.
🧠 Полный разбор — в блоге:
[how-dotnet-aspire-simplifies-service-discovery](https://www.milanjovanovic.tech/blog/how-dotnet-aspire-simplifies-service-discovery)
Подпишись, чтобы не пропускать важные новинки .NET и облачной разработки.6 689
Хотите научиться создавать современные приложения на C# и понять, как работает объектно-ориентированное программирование?
📗 Присоединяйтесь к открытому уроку «Основы ООП на примере C#» 22 июля в 20:00 МСК. Мы разберем:
- Основные принципы ООП: инкапсуляция, наследование, полиморфизм и абстракция.
- Как эти принципы реализуются в языке C#.
- Практические примеры, синтаксис и типичные ошибки начинающих.
🔴 Этот урок — отличная тренировка перед курсом «C# Developer» от OTUS, который стартует совсем скоро. Все участники получат скидку на обучение.
Записаться на вебинар → https://otus.pw/34qD/?erid=2W5zFGwC6ba
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 689
Какое исключение выдается, если протокол, поддерживаемый префиксом URI, недействителен?
6 689
💻 Асинхронная обработка данных в высоконагруженных системах 🚀
🔥 29 июля в 20:00 мск — открытый вебинар в OTUS.
На вебинаре рассмотрим:
- Почему асинхронная архитектура — ключ к масштабируемости и высокой производительности?
- Как эффективно использовать очереди сообщений, веб-сокеты и другие инструменты асинхронного взаимодействия?
- Пример реального архитектурного решения: от веб-сервера до брокера сообщений и БД.
- Как найти узкие места в архитектуре и устранить их для стабильной работы высоконагруженных сервисов.
🎓 После вебинара вы:
- Поймёте принципы асинхронной архитектуры и её влияние на производительность.
- Освоите методы асинхронной обработки данных для масштабируемых систем.
- Получите реальные примеры архитектурных решений для внедрения в свои проекты.
- Узнаете, как избегать узких мест и создавать отказоустойчивые системы.
🔧 Присоединяйтесь, чтобы улучшить архитектурные навыки и начать строить системы, готовые к высокой нагрузке!
👉 Регистрация https://otus.pw/8ta1/?erid=2W5zFJjJ3DS
Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
6 689
📌 PolySharp — удобный способ использовать новые фичи C# на старых версиях .NET. Этот NuGet-пакет работает как source-генератор, автоматически подбирая нужные полифиллы в зависимости от целевой платформы. Для работы достаточно добавить ссылку на PolySharp, установить последнюю версию C# и можно писать современный код даже для .NET Framework или UWP.
Инструмент обладает умной генерацией только необходимых типов. Например, если компилятору C# 13 нужен
[IsExternalInit] для init-only свойств, PolySharp создаст его за кулисами. При этом он не трогает фичи, требующие поддержки рантайма, но покрывает огромный пласт синтаксических улучшений — от nullable-аннотаций до интерполированных строковых обработчиков.
🤖 GitHub
@csharp_ci