Библиотека шарписта | C#, F#, .NET, ASP.NET
22.5K subscribers
2.44K photos
39 videos
85 files
4.64K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
Гид по Redis в C# ASP.NET: ускоряем приложения и снижаем нагрузку на базу данных.

Redis — быстрая база данных в памяти, которая помогает масштабировать системы и ускорять доступ к данным. На открытом вебинаре курса OTUS C# ASP.NET Core разработчик Андрей Сорокин покажет, как интегрировать Redis в ASP.NET Core 8 и внедрить кэширование в реальных проектах.

📌 12 ноября, 20:00
Гид по Redis в C# ASP.NET
— настройка Redis в Docker
— кэширование ответов API
— хранение данных для быстрого доступа
— ускорение обработки запросов и снижение нагрузки на БД

Вебинар бесплатный и будет полезен C#-разработчикам, архитекторам и тимлидам, которые хотят повысить производительность приложений и упростить масштабирование.

👉 Регистрируйтесь: https://clc.to/YMHL9A

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
4
📎 Когда тип спасает

Представьте, что вы пришли в магазин и продавец говорит: «Вот вам что-то. Не знаю что. Может быть, помидоры, может быть, кирпич, может быть, счастье. Узнаете, когда вернётесь домой». Вот такое же ощущение от IActionResult без типов.

Проблема с IActionResult:
[HttpGet("{id:guid}")]
public async Task<IActionResult> GetById(Guid id, ISender mediator, CancellationToken ct)
{
var dto = await mediator.Send(new GetUserQuery(id), ct);
return dto is null ? NotFound() : Ok(dto);
}


Возвращаемый тип — IActionResult. Просто интерфейс. Ничего конкретного. Кто читает этот код, не знает, что именно вернётся. Может быть UserDto, может быть ошибка, может быть что угодно.

Вот так выглядит сгенерированная Swagger документация:
{
"responses": {
"200": { "description": "Success" }
}
}


Никакой информации о схеме. Кто использует ваш API, не знает, какие поля будут в ответе. IDE не может подсказать структуру. Тесты пишутся вслепую.

Решение: ActionResult<T>
[HttpGet("{id:guid}")]
public async Task<ActionResult<UserDto>> GetById(Guid id, ISender mediator, CancellationToken ct)
{
var dto = await mediator.Send(new GetUserQuery(id), ct);
return dto is null ? NotFound() : Ok(dto);
}


Возвращаемый тип — ActionResult<UserDto>. Конкретно и ясно. Читающий код понимает мгновенно: метод возвращает UserDto при успехе или ошибку. Swagger генератор видит типы и строит правильную документацию.

IActionResult можно использовать, когда метод не возвращает тело, к примеру ответ 204.

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍3
👨‍💻 Demystifier: когда стек-трейс не радует

Откройте логи ошибки из продакшена. Видите стек-трейс? Он полон <>c__DisplayClass2_0, d__5``1.MoveNext() и прочих артефактов, которые сгенерировал компилятор. Это не ошибка — это просто то, как .NET преобразует современный C# в IL. Но это делает поиск проблемы медленнее, чем нужно.

Demystifier восстанавливает оригинальный вид кода:

• Вместо ValueTuple``2 param показывает (string val, bool) param
• Вместо Func``1 показывает Func<string>
async методы помечает как async Task<string>
• Локальные функции и лямбды показывает с контекстом

Как применить

Вызовите exception.Demystify() и передайте результат:
try { /* ваш код */ }
catch (Exception ex)
{
logger.LogError(ex.Demystify(), "Ошибка");
}


Анализ стека стоит ресурсов. На высоконагруженной системе вызывать Demystify для каждого исключения неэкономно. Используйте его выборочно — для критических путей, для отладки в development окружении или для редких, но важных ошибок.

➡️ Репозиторий либы

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
📎 Как считать повторения без условных операторов

Нужно посчитать, сколько раз каждое значение встречается в данных. Логично напрашивается проверка:
if (counts.ContainsKey(key))
counts[key]++;
else
counts[key] = 1;


Но есть способ проще:
counts[key] = counts.GetValueOrDefault(key) + 1;


Метод GetValueOrDefault возвращает значение, если ключ есть, или значение по умолчанию (для int это 0). Затем добавляем единицу. Никаких условных операторов, одна строка.

Если можете — используйте LINQ:
var counts = items.GroupBy(x => x.Key)
.ToDictionary(g => g.Key, g => g.Count());


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

🐸Библиотека шарписта

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
⭐️ Microsoft обновила дорожную карту в Visual Studio на ноябрь

Компания работает над несколькими направлениями, которые должны сделать IDE более интегрированной с AI.
Новые агенты для обработки сложных workflow, улучшения в режиме Agent Mode и Chat, а также поддержка работы нескольких агентов одновременно.

По части моделей Microsoft планирует добавить автоматический выбор модели в Chat, GPT-5 Codex, улучшить UX для устаревающих моделей и поддержку разных системных промптов для каждой модели.

Microsoft ставит цель сделать Copilot доступным на каждом этапе разработки — не только для написания кода, но и для поиска, исправления ошибок, написания тестов, коммитов.

➡️ Блог разработчиков

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
6🥱5