C# (C Sharp) programming
18.8K subscribers
738 photos
36 videos
8 files
661 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🎯 Design pattern, который должен знать каждый — Decorator

Один из самых гибких и мощных паттернов — особенно в мире .NET и DI.

Что это такое?
Decorator позволяет обернуть реализацию сервиса в дополнительное поведение — например, логгирование, кэширование или retry-механику — без изменения исходного кода.

Как применить на практике?
В .NET это особенно удобно с библиотекой Scrutor — она расширяет встроенный DI-контейнер и позволяет добавлять декораторы в одну строчку.

Пример:

services.Decorate<IService, LoggingDecorator>();


Зачем это нужно?
— логгировать вызовы без лома архитектуры
— централизованно обрабатывать ошибки
— добавить метрики без влезания в бизнес-логику

📌 Подробнее
🚀 Хочешь масштабировать своё API по горизонтали? Без балансировщика нагрузки не обойтись.

Вот как быстро собрать свой на .NET с помощью YARP (Yet Another Reverse Proxy):

3 простых шага:
1. Установи библиотеку YARP (`Microsoft.ReverseProxy`)
2. Настрой YARP в Program.cs и appsettings.json
3. Укажи пути к downstream-сервисам

После этого твой прокси уже готов к работе — будет распределять трафик между сервисами.

Но это только начало. YARP мощный и расширяемый. Он поддерживает разные политики балансировки нагрузки прямо "из коробки":

Random — случайный выбор
RoundRobin — по кругу
LeastRequests — к тому, у кого меньше всего запросов
FirstAlphabetical — по алфавиту
PowerOfTwoChoices — выбери лучший из двух случайных (дефолт)

Автор статьи применил YARP для масштабирования нескольких приложений и делится опытом в полном гайде:

📖 Читай подробнее: https://milanjovanovic.tech/blog/horizontally-scaling-aspnetcore-apis-with-yarp-load-balancing
🧪 ABP Framework — мощный инструмент для .NET-разработчиков, который превращает стандартный ASP.NET Core в платформу для корпоративных решений. Это не просто фреймворк, а целая экосистема с готовыми модулями, шаблонами проектов и инструментами автоматизации.

Проект имеет поддержку DDD, мультитенантности и микросервисов из коробки. ABP берет на себя рутинные задачи вроде авторизации, валидации и логирования, позволяя сосредоточиться на бизнес-логике.

🤖 GitHub

@csharp_ci
😬 Почти каждый разработчик делал эту ошибку

Код вроде бы нормальный:
- API для регистрации вызывает UserService
- UserService сохраняет пользователя и вызывает EmailService
- EmailService отправляет письмо через SmtpClient

Но если присмотреться — SendWelcomeEmail помечен как **async void** ❗️

Почему это проблема?

async void делает невозможным отлов исключений.
Если внутри SendEmailAsync() что-то пойдёт не так — try/catch не сработает.
Исключение пролетит мимо и может тихо крашнуть приложение или вызвать странные баги.

Почему так?

🔸 async void не возвращает Task, значит await невозможен
🔸 Исключения из таких методов не перехватываются обычным образом

Как правильно:
Всегда возвращай Task — только так можно надёжно обрабатывать ошибки.

📌 Запомни правило:
async void допустим только в event‑handler’ах. Больше — нигде.

Ты уже сталкивался с этой ловушкой? Пиши свои фейлы или советы 👇
⚡️ Почему лучшие разработчики всегда на шаг впереди?

Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.

ИИ: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Devops: t.iss.one/DevOPSitsec
Базы данных: t.iss.one/sqlhub
Мл собес t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
МЛ: t.iss.one/machinelearning_ru
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_ci
Java: t.iss.one/java_library
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Физика: t.iss.one/fizmat
SQL: t.iss.one/databases_tg

Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno

🖥 Chatgpt для кода в тг: @Chatgpturbobot -

📕Ит-книги: https://t.iss.one/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии t.iss.one/addlist/_zyy_jQ_QUsyM2Vi

Подпишись, чтобы всегда знать, куда двигаться дальше!
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 PolySharp — удобный способ использовать новые фичи C# на старых версиях .NET. Этот NuGet-пакет работает как source-генератор, автоматически подбирая нужные полифиллы в зависимости от целевой платформы. Для работы достаточно добавить ссылку на PolySharp, установить последнюю версию C# и можно писать современный код даже для .NET Framework или UWP.

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

🤖 GitHub

@csharp_ci
🧠 Model Context Protocol (MCP) для новичков — от Microsoft

Microsoft выложила в open-source обучающий курс, чтобы помочь понять, как работает Model Context Protocol — протокол, лежащий в основе взаимодействия LLM с внешним контекстом.

📘 Что внутри:
— понятные объяснения концепций MCP
— практические примеры на .NET, Java, TypeScript, JavaScript и Python
— пошаговые упражнения для начинающих

Подойдёт тем, кто хочет разобраться, как строятся LLM-агенты, функции и контекстные вызовы в MCP-экосистеме.

👉 Репозиторий: https://github.com/microsoft/mcp-for-beginners
🔦 Fluent UI Blazor — библиотека компонентов от Microsoft, которая переносит фирменный Fluent Design в Blazor-приложения. Она включает готовые решения для кнопок, карточек, таблиц и сложных элементов вроде диалоговых окон, сохраняя единый стиль современных продуктов Microsoft.

Проект имеет глубокую интеграцию с .NET 8/9 и гибкость: темы настраиваются через CSS-переменные, есть поддержка RTL и адаптация под системные настройки. Для старта можно использовать готовые шаблоны dotnet new или вручную подключить NuGet-пакеты.

🤖 GitHub

@csharp_ci
🧪 Puppeteer Sharp — .NET-порт популярной библиотеки Puppeteer для автоматизации браузера Chrome через DevTools Protocol. Позволяет скриптовать действия в браузере: делать скриншоты, генерировать PDF, парсить динамический контент и тестировать веб-приложения.

Проект поддерживает .NET Standard 2.0+ и .NET 8, включая AOT-компиляцию. Интеграция с C# делает его удобным альтернативным Node.js-версии, например, для E2E-тестов в ASP.NET или массовой генерации документов.

🤖 GitHub

@csharp_ci
🔥 В C# 14 (.NET 10 preview) появляется новое ключевое слово — field

Больше не нужно вручную создавать приватные поля для автосвойств.
Теперь можно обращаться к автоматически создаваемому полю через field прямо внутри get, set или init.

🧩 Пример:

string Name
{
get => field;
set => field = value.Trim();
}


Работает во всех аксессорах
Меньше кода — больше читаемости
Особенно удобно при валидации, логировании, модификации значений

⚠️ Если у тебя уже есть переменная с именем field, будут конфликты. Решения:
- использовать field
- или this.field
- или переименовать существующее поле
Хотите разобраться в тестировании API на ASP.NET Core?

➡️ Присоединяйтесь к открытому уроку «Тестирование API в ASP.NET Core: Интеграция и Нагрузка» 5 августа в 20:00 МСК. На вебинаре мы:
- Разберем ключевые концепции интеграционного и нагрузочного тестирования.
- Научимся писать интеграционные тесты с популярными библиотеками.
- Освоим инструменты для нагрузочного тестирования и анализа результатов.

📗 Этот урок — отличная подготовка к курсу «C# ASP.NET Core разработчик», который стартует совсем скоро. Все участники вебинара получат скидку на обучение!

Записаться на вебинар → https://otus.pw/ZkFR/?erid=2W5zFHq4zj2

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🖍️ MudBlazor — Material Design для Blazor-приложений. Библиотека компонентов для создания современных веб-интерфейсов на C# с минимальным использованием JavaScript. Включает все основные Material-элементы: кнопки, таблицы, диалоги и сложные компоновки.

Инструмент имеет глубокую интеграция с Blazor WASM и Server, включая темы, анимации и адаптивную верстку. Не требует сторонних зависимостей, что упрощает развертывание.

🤖 GitHub

@csharp_ci
🔥 Малоизвестная, но мощная фича в C# — System.Threading.Channels

Если ты всё ещё используешь Queue<T>, BlockingCollection<T> или ConcurrentQueue<T> для передачи данных — пора перейти на новый уровень.

💡 Channels — это современная реализация паттерна producer-consumer:
– без жёсткой связности между компонентами
– с полной поддержкой async/await
– с высокой пропускной способностью

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

Есть два типа:
– UnboundedChannel — без лимита, но риск захламления памяти
– BoundedChannel — с ограничением, идеально для управления нагрузкой

⚙️ Используй Channel<T> вместо старых коллекций — и получи масштабируемую, надёжную архитектуру.

@csharp_ci