C# (C Sharp) programming – Telegram
C# (C Sharp) programming
18.6K subscribers
845 photos
44 videos
8 files
728 links
По всем вопросам- @haarrp

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

@ai_machinelearning_big_data - Machine learning

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

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

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
Как сделать .NET-приложения устойчивыми с помощью Polly

Polly — это мощная библиотека для обработки сбоев и нестабильных сетевых вызовов в .NET.
С её помощью можно легко добавить retry, timeout, circuit breaker и другие стратегии отказоустойчивости.

На картинке показан пример, где применяется два ключевых механизма:

1) Retry (повтор запроса при ошибках)
— Обрабатываем конфликты через Handle<ConflictException>()
— Делаем паузу между попытками (`Delay = 1 сек`)
— Используем экспоненциальный backoff
— Добавляем jitter, чтобы избежать «шторма» повторов
— Ограничиваем количество попыток (`MaxRetryAttempts = 2`)

2) Timeout (ограничение времени выполнения)
— Ставим таймаут в 10 секунд на сетевой запрос

Далее создаётся pipeline и выполняется HTTP-запрос:

await pipeline.ExecuteAsync(async ct ⇒ await httpClient.GetAsync("https://modularmonolith.com", ct));

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


https://github.com/App-vNext/Polly
Media is too big
VIEW IN TELEGRAM
⚡️ Hunyuan 3D Engine

Новый высокоточный ИИ-движок сокращает производство коммерческих 3D-ассетов с недель до нескольких минут.

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

Качество отвечает профессиональному уровню. Новый 3D-DiT модельный стек обеспечивает трёхкратный прирост точности и выдаёт ультра-HD разрешение. Форматы OBJ и GLB легко подключаются к Unreal Engine, Unity и Blender.

Модель также доступна через Tencent Cloud International.

Платформа даёт новым авторам 20 бесплатных генераций в день. Корпоративные клиенты получают 200 бесплатных кредитов при регистрации.

Попробовать движок можно на 3d.hunyuanglobal.com
API: tencentcloud.com/products/ai3d

#AI #3D #Hunyuan3D #Tencent #AItools #3Dgeneration
🎮 Создайте игры с s&box!

s&box — это современный игровой движок на основе Source 2 от Valve и новейших технологий .NET. Он предлагает интуитивно понятный редактор для разработки игр и предоставляет возможность компилировать движок из исходников для тех, кто хочет внести свой вклад в его развитие.

🚀 Основные моменты:
- Современный игровой движок с мощным редактором.
- Основан на Source 2 и .NET технологиях.
- Поддержка разработки и компиляции из исходников.
- Полная документация и обучающие материалы доступны онлайн.

📌 GitHub: https://github.com/Facepunch/sbox-public

#csharp
🖥 Async-блокировки в C# - тема, на которой часто «ловят» на собеседованиях.

Синхронный lock не работает с async/await, и многие пытаются заменить его чем угодно, лишь бы компилилось. Правильный путь — использовать SemaphoreSlim с WaitAsync, как на примере: он позволяет ограничивать конкуренцию и работает корректно в асинхронном коде.

Главное — всегда освобождать семафор в finally и не забывать про таймауты, чтобы не создавать висячие блокировки.

Асинхронная синхронизация — это не магия, а аккуратность и понимание того, как работает планировщик задач в .NET.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Annotation Toolkit помогает дизайнерам прямо в макете объяснить, как должны работать элементы интерфейса.

Проще говоря, он позволяет:

подписывать элементы: что кликается, что меняется, как ведёт себя при разной ширине экрана;

сразу указать требования по доступности: например, какой alt-текст нужен или что должно быть доступно с клавиатуры;

убрать путаницу при передаче макета разработчикам, чтобы они точно понимали задумку.

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

https://github.blog/enterprise-software/collaboration/level-up-design-to-code-collaboration-with-githubs-open-source-annotation-toolkit/
44 000 000+ операций c товарами осуществляется на складских объектах Ozon. Лучший способ влиять на то, как эти товары находят дорогу к покупателям, — откликнуться на одну из этих вакансий.

✔️В команду расписания и отгрузки магистрали:
Руководитель группы разработки C#
Старший C#-разработчик

✔️В команду коммерциализации логистики:
Старший C#-разработчик

✔️В команду учётной интеграции и претензионной работы:
Руководитель группы разработки C#
Старший C#-разработчик
C#-разработчик

Удачи на интервью! 🍀
Почти 50 процентов разработчиков сталкиваются с утечками памяти в EF Core.
И причина у большинства одна и та же.

Ошибочное управление временем жизни DbContext

Многие регистрируют DbContext как scoped и считают что этого достаточно.
На деле всё сложнее.

- DbContext не потокобезопасен.
Делить один экземпляр между потоками приводит к исключениям.

- DbContext лёгкий и должен жить недолго.
Создавай его часто, освобождай сразу.

- Неверная работа с контекстом ведёт к росту памяти и утечкам.

Решения которые уже есть в EF Core

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

DbContext Pooling
Переиспользует заранее подготовленные экземпляры.
Сбрасывает состояние после использования, снижает нагрузку на память и процессор.

Pooled DbContextFactory
Комбинирует фабрику и пул.
Даёт контексты по запросу и эффективно их переиспользует.

⚠️ Правила которые нельзя нарушать

- Никогда не дели DbContext между потоками.
- Всегда освобождай контекст с помощью using или возврата в пул.

Грамотное управление жизненным циклом DbContext повышает стабильность и масштабируемость и убирает скрытые утечки памяти которые годами портят EF Core проекты.

https://antondevtips.com/blog/top-10-mistakes-developers-make-in-ef-core/
🔥 C# Pattern Matching — делает ваш код чище

Вместо громоздких проверок вида:


if (user != null &&
user.Name.Length > 0 &&
user.Subnoscription != null)
{
// ...
}

C# позволяет писать проще и выразительнее:

if (user is { Name.Length > 0, Subnoscription: not null })
{
// ...
}


Что изменилось?

✔️ Нет ручных проверок на null - компилятор сам учитывает это в выражении
✔️ Условие читается как описание объекта, а не как набор проверок
✔️ Логика становится компактнее и легче сопровождается

Используйте pattern matching, чтобы избавляться от лишнего шума и писать более понятный код.
⚡️ Cursor-пагинация действительно очень быстрая - в тестах она оказалась в 17 раз быстрее**, чем классическая offset-пагинация.

Но использовать её нужно не всегда. Вот почему.

Что такое cursor-пагинация
Она работает через «точку отсчёта» - курсор.
Это может быть уникальный идентификатор или набор полей, по которым сортируются записи.
Фронтенд передаёт курсор, и сервер возвращает следующую порцию данных, начиная строго после него.

Почему она быстрая
- Серверу не нужно пересчитывать offset и пропускать тысячи строк.
- Он просто выбирает данные «после курсора».
- Это даёт стабильную производительность даже на больших таблицах.

Но есть нюанс
Cursor-пагинация отлично подходит для:
- лент обновлений
- real-time интерфейсов
- бесконечной прокрутки

Но если пользователи почти всегда открывают только первую страницу, а далее почти не переходят, то обычная offset-пагинация будет проще и тоже очень быстрой.
Для многих приложений это нормальный и достаточный вариант.

Вот подробный разбор с реализацией и тестами.
✔️ Delegating Handlers в .NET: как правильно добавлять сквозную логику для HttpClient

DelegatingHandler - это удобный способ внедрять сквозную логику в каждый HTTP-запрос: авторизацию, логирование, метрики, ретраи и любые другие политики, не трогая основной код.

Пример обработчика аутентификации:

- добавляет заголовок Authorization
- подставляет корректный User-Agent
- затем передаёт управление следующему звену конвейера

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

Подходит для чистой архитектуры, микросервисов и SDK, где важна единообразная обработка запросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ASP.NET Core лайфхак: если нужно получить данные текущего пользователя в любом слое приложения — внедри IHttpContextAccessor и оберни его в сервис UserContext.

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


/// Пример класса контекста пользователя
internal sealed class UserContext(IHttpContextAccessor httpContextAccessor)
: IUserContext
{
public Guid UserId =>
httpContextAccessor
.HttpContext?
.User
.GetUserId() ??
throw new ApplicationException("User context is unavailable");

public bool IsAuthenticated =>
httpContextAccessor
.HttpContext?
.User
.Identity?
.IsAuthenticated ??
throw new ApplicationException("User context is unavailable");
}
Многим C#-разработчикам знакома боль: в проекте хаос из имён классов, обработчиков, сервисов. Общих правил нет, каждый пишет как хочет — и через полгода код сложно читать даже автору.

Есть практичное решение: архитектурные тесты, которые автоматически проверяют соблюдение naming conventions.

Пример ниже - тест, который гарантирует, что все командные обработчики заканчиваются на CommandHandler. Если кто-то добавит класс с неправильным именем, тест упадёт, и проблема решится ещё до ревью.

Такую технику можно использовать для:
- сервисов (`...Service`)
- хендлеров (`...Handler`)
- репозиториев (`...Repository`)
- DTO/Queries/Commands
- модульных границ и зависимости между слоями

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

Пример теста (C#):


public void CommandHandler_ShouldHave_NameEndingWith_CommandHandler()
{
Types.InAssembly(ApplicationAssembly)
.That()
.ImplementInterface(typeof(ICommandHandler<>))
.Or()
.ImplementInterface(typeof(ICommandHandler<,>))
.Should()
.HaveNameEndingWith("CommandHandler")
.GetResult()
.ShouldBeSuccessful();
}


Такие архитектурные проверки избавляют от стихийных ошибок и делают кодовую базу предсказуемой — особенно в больших командах и долгоживущих проектах.
🔥 Открытый урок «Основы работы с Telegram API».

🗓 25 декабря в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «C# Developer».

На вебинаре:
✔️ Рассмотрим общие вопросы посвященные работе c API, WEB API .
✔️ Более подробно познакомимся с работой Telegram API , позволяющей создавать ботов для Telegram.

Кому будет полезно:
- Для начинающих разработчиков, которые хотят создать своего первого бота для Telegram.

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

🔗 Ссылка на регистрацию: https://otus.pw/ZC0M/?erid=2W5zFGtDrat

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
⚡️ Синтаксическое сжатие строк даёт больше вертикального пространства в редакторе. Строки без букв и цифр сжимаются на 25%, благодаря чему на экране помещается больше кода без потери читаемости.

Скоро в Visual Studio.
👨‍💻Задачи точного покрытия — фундамент для многих алгоритмических подходов. Но пока теория лежит на полке, она мало что меняет в вашем инженерном мышлении

На открытом уроке мы разберем Dancing Links через практику: соберем пентамино на столе, представим фигуры в виде строк матрицы и разберемся, как работает поиск с возвратом. Когда алгоритм становится наглядным, вы начинаете понимать, что на самом деле происходит внутри.

Если вы хотите развивать алгоритмическое мышление, системно улучшать свои решения и уверенно чувствовать себя в задачах уровня middle+, такие разборы — обязательная часть роста.

📆 Встречаемся 22 декабря в 20:00 МСК в преддверие старта курса «Алгоритмы и структуры данных», регистрация открыта: https://tglink.io/3be365254757?erid=2W5zFHNTeic

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
This media is not supported in your browser
VIEW IN TELEGRAM
🔍 Инструмент для перехвата сессий в C#

SessionHop — это утилита на C#, использующая COM-объект IHxHelpPaneServer для перехвата пользовательских сессий. С помощью создания "сессионного моникера" и интерфейса Execute можно запускать произвольные файлы в контексте другой сессии, что полезно для таких задач, как кейлоггинг или скриншоты.

🚀Основные моменты:
- Перехват сессий пользователей с помощью COM-объекта.
- Запуск файлов в контексте другой сессии.
- Альтернатива удаленному инжектированию процессов.
- Полезен для доступа к ресурсам как затронутый пользователь.

📌 GitHub: https://github.com/3lp4tr0n/SessionHop

#csharp
🚦 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-архитектуры.

👉 Подробнее