C# Development | YeaHub
743 subscribers
304 photos
33 videos
1 file
537 links
Теория, подготовка к интервью и курсы для C# разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#полезное
😴 C#‑«скрипт» для отправки HTTP-запроса с использованием Flurl.

Эта возможность появится в .NET 10 — подробнее

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#полезное
😴 Как быстро расчистить раздутые API-контроллеры:

Используй метод-инъекцию э

Это малоизвестная фича в ASP.NET Core, которая позволяет внедрять зависимости не в конструктор, а напрямую в метод-обработчик.

Для этого используется [FromServices] IYourService

Хотя [FromServices] можно и опустить — оно не обязательно.

Когда стоит использовать метод-инъекцию:

🟠когда сервис используется только в одном экшене
🟠когда конструктор начинает превращаться в кашу из зависимостей
🟠когда сервис тяжёлый, и важно контролировать его создание и утилизацию

Да, внедрение через конструктор — это дефолтный подход.
Но метод-инъекция — это удобный инструмент, если ты:

- хочешь придерживаться Single Responsibility Principle

- не хочешь превращать контроллер в свалку зависимостей

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #CSharp
🤔 Как устроена строка в С# — ссылочный тип или значимый, и зачем нужен string pool (интернирование)?

string в С# - ссылочный тип с неизменяемым содержимым. CLR использует intern pool - таблицу статически созданных литералов и интернированных строк, чтобы хранить одну копию одинаковых значений. Это экономит память и ускоряет сравнение через ссылочное равенство для литералов.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😎 C# наконец-то получает дискриминируемые объединения

Ну, возможно?

Появилось новое предложение по добавлению объединений типов (Type Unions) в C#. И это действительно важно.

Почему?

Это открывает нативную поддержку таких конструкций, как Result и Option.

Больше не нужно городить костыли, оборачивать значения или зависеть от сторонних библиотек, чтобы описать функцию, возвращающую успех или ошибку.

Я уже много лет выступаю за использование паттерна Result. Но до сих пор отсутствие поддержки на уровне языка делало его применение неуклюжим.


Теперь это может измениться.

В предложении описываются нативные union-типы, включая поддержку pattern matching, проверку исчерпывающего перебора (exhaustiveness checks) и другие фичи.

Не хочешь ждать?

Вот как можно реализовать паттерн Result уже сегодня

Если предпочитаешь бросать исключения — можешь это пропустить.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#полезное
😊 Работать с HTTP-заголовками это сложно?

Короткий ответ: нет. И вот почему

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

Это дополнительные данные, передаваемые вместе с запросом или ответом, которые содержат метаинформацию о сообщении.

Заголовки делятся на 4 группы по контексту:

🟠Request headers (заголовки запроса)
🟠Response headers (заголовки ответа)
🟠Representation headers (информация о формате представления)
🟠Payload headers (сведения о теле запроса/ответа)

В большинстве случаев ты будешь работать именно с заголовками запроса и ответа.

Добавить заголовки в HTTP-запрос можно двумя способами:

🟠Добавить ко всем запросам
🟠Добавить только к конкретному запросу

Если нужно извлечь значение из заголовка , это тоже делается просто.

Оба сценария реализуются достаточно прямолинейно.

HTTP-заголовки повсеместны в современных веб-приложениях, поэтому важно придерживаться лучших практик:

🟠Использовать лаконичные и понятные заголовки
🟠Настраивать кэширование через заголовки (Cache-Control, ETag)
🟠Учитывать CORS (Access-Control-Allow-Origin)
🟠Обеспечивать безопасность уже на уровне заголовков (Strict-Transport-Security, Content-Security-Policy и др.)

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #CSharp
🤔 Чем отличаются lEnumerable и IQueryable? Где применяется отложенное выполнение запросов?

IEnumerable<T> выполняет перебор элементов в памяти (in-memory) и поддерживает отложенное выполнение только LINQ-to-Objects. IQueryable‹T› расширяет IEnumerable‹T> и позволяет строить выражения, которые переводятся в запрос на удалённый источник (БД), выполняя отложенное (deferred) выполнение на стороне сервера при первом переборе.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
❤️‍🔥 EF Core медленный.
ТАКЖЕ ОНИ -> Используют EF Core, чтобы вернуть:


> 25 полей из таблицы,
> 1 000 000 строк за раз,
> включая данные из всех связанных таблиц.

Лучшая оптимизация производительности — это научиться правильно пользоваться инструментами

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👨‍💻 Изменение стандартного представления класса в режиме отладки

К сведению: мы можем изменить стандартное отображение класса в отладчике C# с помощью атрибута DebuggerDisplay

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#Собес #CSharp
🤔 Что такое record в С#? Какие преимущества они дают?

record - это тип-спецификация С # для создания неизменяемых (immutable) ссылочных объектов с автоматически сгенерированными методами Equals, GetHashCode И Tostring . Они поддерживают «неугасающие» (with ) копии с изменением части свойств. Это упрощает работу с DTO и моделями, где важно сравнение по значению и безопасное клонирование.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😎 Зачем нужны health checks и мониторинг?

Если в приложении что-то ломается - ты должен узнать об этом сразу.

Health checks сокращают цикл обратной связи:

ты получаешь уведомление в ту же секунду, как только что-то пошло не так.

Health checks в ASP.NET Core:

🔵 Реализуешь IHealthCheck
🔵 Кастомные проверки пишутся просто
🔵 Есть готовые проверки из коробки
🔵 Гибко настраиваемый формат ответа
🔵 Можно интегрировать с любым инструментом мониторинга или алертинга

Вот как начать использовать Health Checks: тут

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🤯 Как EF Core стал ближе к Dapper?

Всё благодаря одной фиче:

Сырые SQL-запросы к неотражённым типам (unmapped types).

Теперь ваши запросы могут возвращать любые типы, которые можно сопоставить, не добавляя их в EF-модель.

Рекомендуемый способ использования это метод SqlQuery<T> для параметризованных запросов.

Ключевые особенности этой фичи:

> Поддержка представлений , хранимых процедур и функций
> Комбинирование SQL и LINQ в одном запросе
> Защита от SQL-инъекций

В одном из проектов мы внедрили 3 таких запроса в прод, и сразу заметили, что код стал чище и легче в поддержке.


👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
😱 Забирай мой подход к упрощению управления потоками:

(в .NET 9)

Вместо использования классического System.Threading.Monitor, в .NET 9 появился новый тип — System.Threading.Lock.

Вместе с ним добавлен метод Lock.EnterScope(), который создаёт эксклюзивную область и автоматически освобождает блокировку в конце блока кода.

Этот тип даёт более удобную и безопасную синхронизацию потоков за счёт нового API.

Оператор lock в C# теперь сам распознаёт, если ты передаёшь объект типа Lock.

В этом случае он использует новый API, а не старый Monitor.

Пример кода выше.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #CSharp
🤔 Как вы делили микросервисы по доменным областям?

Сервисы группируют по аккуратным bounded context: пользователи, заказы, инвентарь, биллинг. Каждая область отвечает за свой контекст данных и бизнес-логику, хранит собственную БД. Это упрощает понимание, тестирование и развитие отдельных частей системы. При необходимости добавляют сервисы-агрегаторы для оркестрации.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2😁1
#полезное
🛞 LeftJoin будет поддерживаться в Entity Framework 10.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😘 Как сделать ужасный API-дизайн:

- Возвращай 200 OK с телом {"success": false}

А как лучше?

Используй Problem Details для обработки ошибок в API.

Хотя бы договоритесь в команде о едином формате ответов при ошибках.

Я видел API, которые возвращают 200 OK даже при ошибке в теле (да, это в сторону GraphQL-разработчиков).

Problem Details — это стандарт для описания ошибок в HTTP-ответах.

Обычных HTTP-статусов недостаточно, чтобы передать полезную информацию об ошибке.

Реализовать Problem Details в .NET — на самом деле просто.

Вот гайд: читать

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
😜 Authentication
Properties в
ASP.NET Core — недооценённый, но важный механизм

Если вы используете куки или OpenID Connect в ASP.NET Core, то наверняка сталкивались с объектом AuthenticationProperties. Он не просто "дополнительные параметры" — это мощный инструмент управления поведением аутентификации.

Что можно сделать с AuthenticationProperties:

• Установить срок действия куки:

new AuthenticationProperties { ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1) }


• Указать URL возврата после логина:


new AuthenticationProperties { RedirectUri = "/dashboard" }


• Добавить временные метки, элементы состояния, флаги:
Например, IsPersistent, IssuedUtc, AllowRefresh, и кастомные значения.

• Используется в:

HttpContext.SignInAsync(...)

ChallengeAsync(...) для OIDC

редиректах после логина/логаута

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

Полный разбор:
https://blog.duendesoftware.com/posts/20250527-the-role-of-authenticationproperties-in-aspnet-core

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес #CSharp
🤔 В чём преимущества микросервисной архитектуры перед МОНОЛИТОМ?

Микросервисы позволяют развивать, развёртывать и масштабировать каждую бизнес-функцию независимо, снижая время выхода фичи. Они повышают устойчивость: сбой одного сервиса не останавливает всю систему. Также каждая команда может выбирать оптимальный стек технологий. Но требуют сложной инфраструктуры для оркестрации и мониторинга.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👋 Как защитить приложение от уязвимостей:

(всего в 4 строках кода)

Используйте ASP.NET Core 8 Identity

ASP.NET Core 8 Identity вводит новые API, упрощающие реализацию входа и управление учетными записями.

С минимальными усилиями вы можете защитить Web API, добавив аутентификацию и авторизацию.

После быстрой настройки (всего в несколько строк кода) вы автоматически получаете готовые эндпоинты для:

✅двухфакторной аутентификации
✅входа в систему
✅регистрации
✅сброса пароля
✅подтверждения email

Безопасность это не то, что стоит реализовывать с нуля самостоятельно.

Выше пример, как это настроить

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😐 Dapper быстрый, но отображение отношений "один ко многим" может вызвать проблемы.

В чём проблема?

SQL-join возвращает дублированные данные с "одной" стороны, а Dapper отдаёт по одной строке за раз.

Как решить?

Используйте Dictionary<TKey, TEntity>, чтобы отслеживать и повторно использовать родительские объекты при добавлении дочерних элементов.

Это просто, как только вы освоите шаблон.

Вот чистый пример: ссылка на статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😬 Как перестать усложнять проверки типов:

(и назначать переменные с ненулевыми значениями)

Используйте шаблон объявления (declaration pattern).

Шаблон объявления позволяет проверить, совместим ли тип выражения во время выполнения с указанным типом.

Также можно объявить локальную переменную как результат этой проверки.

Пример использования шаблона объявления в коде выше.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#Собес #CSharp
🤔 Как решали проблему высокой нагрузки на БД при генерации отчетов?

Отчёты перенесли в отдельное аналитическое хранилище (Data Warehouse) с регулярным ETL из OLTP- базы. Для срочных отчётов использовали materialized view c incremental refresh либо pre-aggregated таблицы, обновляемые по расписанию. Часто применяли асинхронную генерацию через background job (Hangfire, Quartz) и кэширование результатов в Redis.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM