Библиотека шарписта | C#, F#, .NET, ASP.NET
Kanalga Telegram’da o‘tish
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Ko'proq ko'rsatish22 395
Obunachilar
-724 soatlar
-357 kunlar
-12830 kunlar
Ma'lumot yuklanmoqda...
O'xshash kanallar
Taglar buluti
Kirish va chiqish esdaliklari
---
---
---
---
---
---
Obunachilarni jalb qilish
Dekabr '25
Dekabr '25
+75
1 kanalda
Noyabr '25
+133
1 kanalda
Get PRO
Oktabr '25
+66
0 kanalda
Get PRO
Sentabr '25
+121
0 kanalda
Get PRO
Avgust '25
+106
1 kanalda
Get PRO
Iyul '25
+126
0 kanalda
Get PRO
Iyun '25
+136
0 kanalda
Get PRO
May '25
+138
0 kanalda
Get PRO
Aprel '25
+204
1 kanalda
Get PRO
Mart '25
+307
2 kanalda
Get PRO
Fevral '25
+304
2 kanalda
Get PRO
Yanvar '25
+241
2 kanalda
Get PRO
Dekabr '24
+251
2 kanalda
Get PRO
Noyabr '24
+230
2 kanalda
Get PRO
Oktabr '24
+223
2 kanalda
Get PRO
Sentabr '24
+198
2 kanalda
Get PRO
Avgust '24
+189
2 kanalda
Get PRO
Iyul '24
+219
2 kanalda
Get PRO
Iyun '24
+176
2 kanalda
Get PRO
May '24
+458
2 kanalda
Get PRO
Aprel '24
+497
7 kanalda
Get PRO
Mart '24
+460
7 kanalda
Get PRO
Fevral '24
+501
7 kanalda
Get PRO
Yanvar '24
+641
6 kanalda
Get PRO
Dekabr '23
+785
7 kanalda
Get PRO
Noyabr '23
+415
2 kanalda
Get PRO
Oktabr '23
+594
7 kanalda
Get PRO
Sentabr '23
+1 498
7 kanalda
Get PRO
Avgust '230
8 kanalda
Get PRO
Iyul '230
2 kanalda
Get PRO
Iyun '23
+14
0 kanalda
Get PRO
May '23
+587
2 kanalda
Get PRO
Aprel '23
+759
0 kanalda
Get PRO
Mart '23
+43
0 kanalda
Get PRO
Fevral '23
+1 106
0 kanalda
Get PRO
Yanvar '230
0 kanalda
Get PRO
Dekabr '220
0 kanalda
Get PRO
Noyabr '220
0 kanalda
Get PRO
Oktabr '22
+102
0 kanalda
Get PRO
Sentabr '22
+394
0 kanalda
Get PRO
Avgust '22
+503
0 kanalda
Get PRO
Iyul '22
+525
0 kanalda
Get PRO
Iyun '22
+581
0 kanalda
Get PRO
May '22
+289
0 kanalda
Get PRO
Aprel '22
+339
0 kanalda
Get PRO
Mart '22
+455
0 kanalda
Get PRO
Fevral '22
+241
0 kanalda
Get PRO
Yanvar '22
+14 559
0 kanalda
| Sana | Obunachilarni jalb qilish | Esdaliklar | Kanallar | |
| 17 Dekabr | +1 | |||
| 16 Dekabr | +2 | |||
| 15 Dekabr | +2 | |||
| 14 Dekabr | +2 | |||
| 13 Dekabr | +3 | |||
| 12 Dekabr | +8 | |||
| 11 Dekabr | +7 | |||
| 10 Dekabr | +6 | |||
| 09 Dekabr | +9 | |||
| 08 Dekabr | +5 | |||
| 07 Dekabr | 0 | |||
| 06 Dekabr | +4 | |||
| 05 Dekabr | +10 | |||
| 04 Dekabr | 0 | |||
| 03 Dekabr | +8 | |||
| 02 Dekabr | +4 | |||
| 01 Dekabr | +4 |
Kanal postlari
⚙️Паттерн пагинации и фильтрации через один запрос и нормальные DTO
Пагинация в API часто превращается либо в магию репозиториев, либо в жуткий копипаст. Лучше держать всё предельно простым: один запрос с фильтрами, подсчётом и проекцией в DTO.
Что вообще хотим от пагинации
Когда фронт просит список пользователей, ему нужно не только «20 штук с offset», а нормальные данные
• Текущая страница.
• Размер страницы.
• Список элементов.
• Общее количество записей под этими фильтрами.
public sealed record Paginated<T>(
IReadOnlyList<T> Items,
int Page,
int Size,
int Total
);
Это контейнер для любого списка: пользователей, заказов или логов.
Items то, что реально отображаем.
Page номер текущей страницы.
Size сколько элементов на странице.
Total сколько записей всего под заданным фильтром.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view200
| 2 | 🛠 Инструмент для трассировки без шума в коде
В ASP.NET трассировка маршрутизации, middleware и хостинга держится не на конкретном логгере, а на связке DiagnosticSource и DiagnosticListener.
Смысл DiagnosticListener в том что вы можете из кода публиковать диагностические события, не навязывая никому ни конкретный логгер, ни конкретный APM.
Источник событий ничего не знает о подписчиках, а подписчики могут подключаться и отключаться динамически, не требуя изменений основной логики.
Простой пример:
public static class OrderDiagnostics
{
public static readonly DiagnosticListener Listener =
new("MyApp.Orders");
}
public async Task ProcessOrder(Order order)
{
if (OrderDiagnostics.Listener.IsEnabled("OrderProcessed"))
OrderDiagnostics.Listener.Write("OrderProcessed", new { order.Id });
// основная логика обработки
}
Если никто не подписан, проверка IsEnabled сразу вернет false и код почти ничего не стоит по времени. Как только появляется listener, он может наблюдать за событиями, строить трейс, метрики или слать данные в OpenTelemetry.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор | 1 334 |
| 3 | 🎁 Письмо Деду Морозу
До Нового Года 15 дней! Что бы вы хотели получить в подарок? Годовая премия не в счёт, это всегда как рулетка — повезёт/не повезёт.
Админ хотел бы набор оперативной памяти, желательно гига 32, откладывал до последнего и вот итог..
💬 Делитесь своими хотелками или сразу вишлистами в комментах 👇
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#entry_point | 1 902 |
| 4 | 👨💻 Microsoft показали рабочий рецепт iOS виджетов
В официальном .NET блоге появилась большая статья о том как собирать iOS виджеты поверх .NET MAUI не теряя нативности.
Автор делится практическим опытом, который раньше приходилось выкапывать по кускам в доках Apple и чужих репозиториях.
Статья не пошаговый туториал, а набор ключевых шагов и граблей от настроек App Groups и bundle id до интеграции Xcode виджет расширения в MAUI проект.
➡️ Читать статью
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view | 2 250 |
| 5 | ⏳ GetElapsedTime вместо ручного Stopwatch шаблона
Многие до сих пор измеряют время в .NET по старинке создают экземпляр Stopwatch, вызывают Start, ждут выполнение и читают Elapsed.
Но есть более простой и аккуратный способ через Stopwatch.GetTimestamp и Stopwatch.GetElapsedTime.
Классический шаблон выглядит так:
long start = Stopwatch.GetTimestamp();
// код, который нужно измерить
await ProcessOrderAsync();
TimeSpan elapsed = Stopwatch.GetElapsedTime(start);
GetElapsedTime вычисляет разницу между текущим timestamp и сохранённым значением и возвращает TimeSpan без создания экземпляра Stopwatch. В результате нет лишней аллокации.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view | 2 513 |
| 6 | 🚦 SemaphoreSlim в проде — не просто «асинхронный lock»
SemaphoreSlim часто кидают в код как самое простое решение и успокаиваются. В проде этого мало, ведь малейшая ошибка с Release, областью блокировки или per-key словарем легко превращается в дедлок, гонку или утечку памяти.
Самый частый фейл — банальное «забыли Release». Исключение между WaitAsync и finally и семафор навсегда занят поэтому все будущие вызовы повисают. Помогает только жесткое правило всегда оборачивать WaitAsync в try finally и не вставлять лишний код между ними особенно никакой логики которая может бросить исключение.
Вторая классика — блокировки внутри async кода. Варианты вроде _lock.Wait() или .Result внутри секции под SemaphoreSlim открывают прямую дорогу к дедлокам, потому что блокирующий вызов держит поток, а продолжение ждет этот же поток.
Общий принцип не блокировать внутри асинхронной критической секции если нужно синхронное API выносить его в Task.Run до входа в lock.
Поэтому в проде почти всегда лучше прятать SemaphoreSlim за абстракцией AsyncLock. Обертка с LockAsync() возвращающей IDisposable снимает часть рисков.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор | 2 545 |
| 7 | Сборщик мусора для старых знаний
В экосистеме .NET всё меняется, но фундамент вечен. Если чувствуешь, что уперся в потолок сеньорити, пора инвестировать в хард-скиллы, а не просто учить новый синтаксис C
12.
Оффер 1 + 2:
Покупаешь один курс (по старшей цене) — получаешь доступ к трем.
Выбор .NET-комьюнити:
— архитектуры и шаблоны проектирования (SOLID, GRASP и вот это всё);
— алгоритмы и структуры данных.
Скомпилировать успех
Акция до 31 декабря.
NullReferenceException при выборе? Пиши сюда: @manager_proglib | 2 538 |
| 8 | 👨💻 Не хватает комментария «Создаёт переменную x равную 10»
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#garbage_collector | 2 600 |
| 9 | ⚙️ Один обработчик вместо сотни try catch
Когда в проекте десятки эндпоинтов, разъезжающий по коду try catch быстро превращается в свалку. Гораздо проще один раз настроить глобальный маппинг исключений в HTTP статус и возвращать нормальные ProblemDetails для всех ошибок.
ASP.NET уже умеет работать с ProblemDetails из коробки, нужно только включить службу и повесить обработчик ошибок.
В примере вся логика перевода исключений в HTTP ответы живет в одном месте:
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler(appErr =>
{
appErr.Run(async ctx =>
{
var ex = ctx.Features.Get<IExceptionHandlerFeature>()?.Error;
var (status, title) = ex switch
{
ConcurrencyException => (StatusCodes.Status409Conflict, "Concurrency conflict"),
NotFoundException => (StatusCodes.Status404NotFound, "Resource not found"),
_ => (StatusCodes.Status500InternalServerError, "Server error")
};
ctx.Response.StatusCode = status;
await ctx.Response.WriteAsJsonAsync(new ProblemDetails
{
Status = status,
Title = title,
Detail = app.Environment.IsDevelopment() ? ex?.Message : null,
Instance = ctx.Request.Path
});
});
});
Любые новые исключения добавляются через одну запись в switch, без походов по контроллерам, а все ответы об ошибках приходят в едином формате application/problem+json, что упрощает жизнь фронту и интеграциям.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view | 2 634 |
| 10 | Voting ❓ Лучший пост недели | 2 715 |
| 11 | 📊 Рейтинг постов
Вы всю неделю ставили нам лайки, а мы выбрали топ по реакциям:
• 100 RPS Rate Limiting
• Закон Брукса в разработке
• Антиспам в .NET
• FluentValidation в API
• StackTraceHiddenAttribute
Давайте выберем самый лучший пост в голосовании.
Что добавить в следующий спринт? Пишите! 👇
🐸Библиотека шарписта
#entry_point | 2 632 |
| 12 | 🆕 Дайджест недели
Собрали в один пост всё, что произошло за неделю.
— Первое сервисное обновление .NET 10
— Кроссплатформенная SharpIDE
— Fleet В С Ё
Почитать:
— Карьерная «страховка» для IT‑шника
— Как вуз влияет на карьеру
— Закон Брукса в разработке
🐸Библиотека шарписта
#async_news | 2 591 |
| 13 | 🔄 WSL 2.7.0: обновление с новым ядром
Windows Subsystem for Linux это встроенный слой совместимости, который позволяет запускать Linux и его приложения напрямую без виртуальной машины.
В WSL 2.7.0 ядро обновили до ветки Linux 6.6.114. Параллельно подтянули новые версии WSLg .NET и связанных NuGet пакетов.
Список поддерживаемых дистрибутивов пополнился свежими релизами: Debian 13, Ubuntu 25.10, Fedora 43, а также Kali 2025.3 и декабрьская сборка Arch Linux.
➡️ Релиз на GitHub
🐸Библиотека шарписта
#async_news | 2 792 |
| 14 | 👨💻 Чистые стектрейсы в .NET с помощью StackTraceHiddenAttribute
В .NET есть простой способ скрыть внутреннюю кухню и оставить только то, что важно потребителю API. Атрибут StackTraceHiddenAttribute помечает методы, которые не должны попадать в публичный стектрейс, при этом логика выполнения не меняется.
Пример:
public static class UserService
{
[StackTraceHidden]
private static void ValidateName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Name cannot be empty");
}
public static void CreateUser(string name)
{
ValidateName(name);
Console.WriteLine("Created user " + name);
}
}
В этом примере при исключении из ValidateName в стектрейсе вы увидите только вызов UserService.CreateUser. Валидационный хелпер скрыт атрибутом, поэтому внешний разработчик не видит внутренний слой проверки.
🐸Библиотека шарписта
#sharp_view | 3 029 |
| 15 | 💼 Карьерная «страховка» для IT‑шника
Собрали для вас в карточках пункты, которые необходимо знать, чтобы вас не смогли выпнуть с работы. Знайте свои права и читайте полную статью.
🐸Библиотека шарписта | 3 531 |
| 16 | 🌐 Контроллеры без мусора
Пишете API, и в каждом контроллере приходится проверять if (!ModelState.IsValid) return BadRequest(). Скучно копипастить одно и то же. А если контроллеры станут реально чистыми — только маршрутизация и вызов сервиса?
[ApiController] автоматически подключает механизм валидации. Он ищет в DI IValidator<T> для ваших DTO/команд и запускает их до входа в метод контроллера.
FluentValidation делает так, что все ваши AbstractValidator<T> автоматически регистрируются как IValidator<T>.
Настройка за 5 секунд:
// Program.cs
builder.Services.AddControllers()
.AddJsonOptions(o => o.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase);
builder.Services.AddValidatorsFromAssembly(typeof(CreateUserValidator).Assembly);
Теперь все ваши AbstractValidator<T> автоматически работают.
Вот так пишется валидатор:
public class CreateUserValidator : AbstractValidator<CreateUserCommand>
{
public CreateUserValidator()
{
RuleFor(x => x.Email).NotEmpty().EmailAddress().MaximumLength(256);
RuleFor(x => x.DisplayName).NotEmpty().MaximumLength(100);
RuleFor(x => x.Password).NotEmpty().MinimumLength(8);
}
}
Итоговый эндпоинт:
[ApiController]
[Route("users")]
public class UsersController : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Create(CreateUserCommand cmd)
{
var user = await _mediator.Send(cmd);
return CreatedAtAction(nameof(Get), new { id = user.Id }, user);
}
}
Один раз настроили — наслаждаетесь чистотой контроллеров и валидацией.
🐸Библиотека шарписта
#il_люминатор | 3 146 |
| 17 | ⚡️ Fleet В С Ё
JetBrains убивает Fleet как продукт, но не как технологию: с 22 декабря 2025 его перестанут распространять и команда переезжает в новый инструмент для «агентной разработки» — среды, где код пишут в основном AI‑агенты, а разработчик управляет задачами и ревьюит патчи.
Fleet создавали как эксперимент: лёгкая архитектура, современный UI, свобода от легаси IntelliJ-платформы, и технически он реально удался — его компоненты и UX‑решения уже раскатаны по другим IDE от JetBrains.
➡️ Оригинальный анонс
🐸Библиотека шарписта
#async_news | 3 338 |
| 18 | 🧑💻 IDE для .NET, написанная на .NET
У нас тут интересный эксперимент из мира .NET‑инструментов — SharpIDE.
Это кроссплатформенная IDE для .NET, которую делают не на Java и не на Electron, а на самом .NET + движок Godot для UI.
Автор позиционирует её как полностью open source‑альтернативу классическим IDE с упором на расширяемость и игровой UI
➡️ Репозиторий проекта
🐸Библиотека шарписта
#sharp_view | 3 660 |
| 19 | 🎮 Портфолио, в которое хочется играть
Наткнулись на резюме разраба, которое явно не пройдёт роботизированную проверку, потому что робот ничего не поймёт.
Резюме сделано в виде 3D игры, где нужно кататься на машинке по точкам интереса: проекты, места работы, соц. сети. У обычного HR'а на такое точно не хватит времени.
Челлендж от админа — попробуйте выбить страйк в левой части карты. Скидывайте скрины в комменты 👇
➡️ Выбить страйк
🐸Библиотека шарписта
#GoTalk | 3 451 |
| 20 | 🔄 Первое сервисное обновление .NET 10
Вышло сервисное обновление для десятой версии платформы, в котором правят баги и стабильность без новых фич.
Обновление помечено как non security: оно не закрывает уязвимости, а дорабатывает поведение рантайма, BCL и SDK после выхода 10.0.0.
➡️ Release notes
🐸Библиотека шарписта
#async_news | 3 309 |
