C# 1001 notes
6.51K subscribers
326 photos
9 videos
2 files
312 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
加入频道
🔐 Блог DevelopersVoice выпустил отличный гайд по **10 главным уязвимостям веб‑приложений с примерами на .NET.

Что внутри:
• Инъекции и XSS
• Ошибки аутентификации
• Уязвимые зависимости
• SSRF и плохая конфигурация
• Проблемы с логированием и безопасным дизайном

📌 Всё с практическими советами: как обнаружить, как исправить, как не допустить.

Полный гайд тут: https://developersvoice.com/blog/secure-coding/owasp-top-ten

#OWASP #SecureCoding #DotNet #WebSecurity #DevTips
📌 PolySharp — удобный способ использовать новые фичи C# на старых версиях .NET. Этот NuGet-пакет работает как source-генератор, автоматически подбирая нужные полифиллы в зависимости от целевой платформы. Для работы достаточно добавить ссылку на PolySharp, установить последнюю версию C# и можно писать современный код даже для .NET Framework или UWP.

Инструмент обладает умной генерацией только необходимых типов. Например, если компилятору C# 13 нужен [IsExternalInit] для init-only свойств, PolySharp создаст его за кулисами. При этом он не трогает фичи, требующие поддержки рантайма, но покрывает огромный пласт синтаксических улучшений — от nullable-аннотаций до интерполированных строковых обработчиков.

🤖 GitHub

@csharp_ci
Какое исключение выдается, если протокол, поддерживаемый префиксом URI, недействителен?
Anonymous Quiz
10%
URLNotFound
29%
NotSupportedException
49%
UriFormatException
12%
URLSourceNotFound
🔥 .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 и облачной разработки.
😈 Хитрая задачка на 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# захватывают переменные, а не их значения! Аккуратнее с циклами и лямбдами.
Почти каждый разработчик допускал эту ошибку.

Что не так с этим кодом?

На первый взгляд всё кажется логичным:

🔸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 обязателен.
Please open Telegram to view this post
VIEW IN TELEGRAM
Правильный способ построения асинхронных API в .NET

Большинство API работают по простому шаблону:

🔸Клиент отправляет запрос
🔸Сервер выполняет работу
🔸Сервер возвращает ответ

Такой подход отлично работает для быстрых операций — например, получения данных или простых обновлений.

А что насчёт длительных операций?

Речь о задачах вроде:

> обработки больших файлов
> генерации отчётов
> конвертации видео

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

Вот как можно правильно строить асинхронные API: читать

Как сообщить клиенту, что его запрос обработан?

Есть два подхода:

🔸PULL — клиент опрашивает API, чтобы узнать статус

🔸PUSH — сервер сам уведомляет клиента (через WebSocket, email и т.д.)
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Задача: "Сколько раз выполнится блок 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_notes
🔥 𝟮𝟬 Полезных статей для изучения 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
🧼 Как элегантно работать с конфигами в .NET?

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

Сейчас всегда использую Options pattern — и вот почему:

Привязываешь конфигурацию к строго типизированным классам
Добавляешь валидацию через аннотации
Чисто внедряешь настройки через DI (`IOptions<T>` или `IOptionsSnapshot<T>`)

Отлично работает для:
- appsettings.json
- фичефлагов
- конфигов внешних сервисов

Если хочешь чистый и масштабируемый код — лучше подхода пока нет.
🔍 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Лучшая фича в 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 с исходниками для фронта и бэка. Пиши, если интересно!
This media is not supported in your browser
VIEW IN TELEGRAM
На E-CODE одно из фокусных направлений — C#. Доклады экспертов на главном IT-событии осени будут в треке Backend 💙

Заходите смотреть программу и регистрироваться — места улетают стремительно.

Успех ждёт middle+ инженеров — команда Ozon Tech собирает в пространстве E-CODE профессиональное комьюнити. Общаться, меняться опытом и контактами, находить идеи и своё место в этом большом мире IT.

Или хотя бы у сцены — в лайнапе E-CODE НТР, Заточка, ILWT и Нейромонах Феофан.
E-CODE — событие, на котором вам стоит побывать.

Зарегистрироваться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧰 .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
⚙️ Утилиты для асинхронного программирования в .NET

Если ты работаешь с async/await и хочешь писать более чистый, безопасный и удобный код — попробуй AsyncEx.

Это мощная библиотека с готовыми асинхронными инструментами:

🔒 AsyncLock — асинхронный мьютекс: синхронизирует доступ к ресурсу *без блокировки потока*.

🚦 AsyncSemaphore — ограничивает количество одновременно выполняющихся задач, но *в асинхронной манере*.

📦 AsyncLazy — отложенная инициализация, которая запускается только при первом вызове. Работает в `async`-контексте.

📡 AsyncConditionVariable — асинхронная переменная состояния: удобно ожидать/уведомлять задачи о смене состояния ресурса.

📣 AsyncEvent — асинхронные события: подписка и вызов обработчиков без блокировки.

🧰 TaskHelper — утилиты для работы с задачами: ожидание, отмена, управление результатами.

🚀 Как начать?

Просто установи через NuGet:

https://github.com/StephenCleary/AsyncEx
Ваши коллеги уже изучают .NET 10 → а вы готовы остаться на старых версиях?

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

.NET 10 — это не просто очередное обновление. Это LTS-версия, которая задаст стандарты разработки на ближайшие годы. Новый синтаксический сахар, field и extension в C# 14, обновления в MAUI и EF Core — всё это уже меняет то, как пишут современные приложения.

Вебинар «Что нового в .NET 10 для разработчиков» в рамках курса «C# углубленный»

→ 18 августа, 20:00

→ Антон Герасименко

Программа:

→ Обзор ключевых нововведений .NET 10 и их практическое применение
→ Синтаксические конструкции C# 14: сахар, field, extension
→ Изменения в runtime и их влияние на производительность приложений 
→ Новые возможности MAUI и EF Core для современной разработки

После вебинара вы поймёте, как адаптировать свой код под новые стандарты, сможете читать и писать современный C# код и не будете отставать от коллег, которые уже перешли на актуальные версии.

Бесплатная регистрация — займите место в числе первых:
https://otus.pw/MPD1A/?erid=2W5zFHPhUCQ

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🖥 Полезная фишка в C#, о которой никто не знает

Этот прием позволяет создавать высокопроизводительные .NET-приложения.

Разработка надёжных, масштабируемых и быстрых .NET-приложений во многом зависит от того, как вы организуете конкуренцию и обработку данных.

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

Ранее для этого использовали такие конструкции, как Queue<T>, ConcurrentQueue<T> или BlockingCollection<T>.

Эти очереди оборачивали в классы и применяли для управления потоками данных.

Однако у таких решений есть существенный минус — сильная связанность кода. 💊

Channels в C# это малоизвестная, но мощная фишка, которая предлагает современный способ построения безопасных, асинхронных и высоконагруженных .NET-приложений.

Они реализуют паттерн "производитель-потребитель": один класс создаёт данные, другой их потребляет - при этом оба ничего не знают друг о друге.

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

В этом гайд, где узнаете:

🟠Что такое C# Channels?
🟠 Ограниченные vs. неограниченные каналы
🟠 Фоновая обработка через Channels
🟠 Применение каналов в боевом ASP.NET Core-приложении
🟠 Лучшие практики и советы по работе с Channels
Please open Telegram to view this post
VIEW IN TELEGRAM