ch
Feedback
Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET

前往频道在 Telegram

Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

显示更多

📈 Telegram 频道 Библиотека шарписта | C#, F#, .NET, ASP.NET 的分析概览

频道 Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 21 701 名订阅者,在 技术与应用 类别中位列第 5 943,并在 俄罗斯 地区排名第 30 267

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 21 701 名订阅者。

根据 29 八月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -48,过去 24 小时变化为 -6,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 16.72%。内容发布后 24 小时内通常能获得 7.84% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 3 628 次浏览,首日通常累积 1 702 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 23
  • 主题关注点: 内容集中在 .net, шарписта, навигация, await, string 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

凭借高频更新(最新数据采集于 30 八月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

21 701
订阅者
-624 小时
-57
-4830
帖子存档
🎁 И мозг прокачать, и макбук утащить! Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻 Условия: 1️⃣ П
🎁 И мозг прокачать, и макбук утащить! Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻 Условия: 1️⃣ Покупаешь любой курс Proglib до 15 ноября. 2️⃣ Проходишь минимум 2 учебные недели (можно осилить за два вечера). 3️⃣ Пишешь куратору в чат своего курса: #розыгрыш. Что за курсы?Математика для Data Science (6 месяцев боли и просветления). — Основы Python, ML, алгоритмы, AI-агенты и даже курс для тех, кто в IT, но не кодит. 👉 Участвовать в розыгрыше

💬 Всё, что вам нужно знать о главном событии года для .NET разработчиков Через неделю начинается самая важная конференция дл
💬 Всё, что вам нужно знать о главном событии года для .NET разработчиков Через неделю начинается самая важная конференция для .NET сообщества — .NET Conf 2025. С 11 по 13 ноября пройдёт трёхдневная бесплатная виртуальная конференция, где будет официально представлена .NET 10 и показаны новые возможности Visual Studio 2026. Самые интересные сессии первого дня: • C# 14: Новые языковые фичи — улучшенная ясность кода и новые паттерны программирования • Производительность .NET 10 — оптимизации во всей платформе и компиляторе Blazor в .NET 10 — WebAuthN, passkeys, улучшенная диагностика и производительность • Aspire: облачная разработка — опinionated фреймворк для observable, production-ready распределённых приложений • Agentic Development — как строить AI-агентов, которые могут рассуждать, планировать и действовать • .NET MAUI обновления — новые компоненты, производительность, улучшенный tooling Второй день: • Облачная разработка с Azure — контейнеры, K8s, функции и AI-сервисы • Remote MCP servers — как строить собственные интеграции • Redis интеграция с .NET • Расширение и кастомизация Aspire — custom integrations и расширенный функционал • Microsoft.Testing.Platform — новый фреймворк тестирования ➡️ Анонс от Microsoft 🐸Библиотека шарписта #async_news

🤩 Lorem ipsum, который имитирует научный вздор Представьте: нужно заполнить макет контентом, чтобы дизайнер видел, как всё в
🤩 Lorem ipsum, который имитирует научный вздор Представьте: нужно заполнить макет контентом, чтобы дизайнер видел, как всё выглядит. Берёте Lorem ipsum. Но он выглядит как набор слов. А если нужен текст, который с первого взгляда кажется серьезным, но при внимательном чтении — полная чушь? Вот для этого WaffleGenerator. Это библиотека, которая генерирует абзацы в стиле научно-популярного бреда. Текст выглядит настоящим: правильная структура, логичные переходы, официальный тон. Но если вы прочитаете внимательно, поймёте, что там просто красивые слова без смысла. Как применить Просто:
var text = WaffleEngine.Html(paragraphs: 2, includeHeading: true);
var text = WaffleEngine.Text(paragraphs: 1, includeHeading: true);
var markdown = WaffleEngine.Markdown(paragraphs: 1, includeHeading: true);
Поддерживает три формата: HTML, обычный текст и Markdown. ➡️ Попробовать либу 🐸Библиотека шарписта #sharp_view

⭐️ Microsoft обновила дорожную карту в Visual Studio на ноябрь Компания работает над несколькими направлениями, которые должн
⭐️ Microsoft обновила дорожную карту в Visual Studio на ноябрь Компания работает над несколькими направлениями, которые должны сделать IDE более интегрированной с AI. Новые агенты для обработки сложных workflow, улучшения в режиме Agent Mode и Chat, а также поддержка работы нескольких агентов одновременно. По части моделей Microsoft планирует добавить автоматический выбор модели в Chat, GPT-5 Codex, улучшить UX для устаревающих моделей и поддержку разных системных промптов для каждой модели. Microsoft ставит цель сделать Copilot доступным на каждом этапе разработки — не только для написания кода, но и для поиска, исправления ошибок, написания тестов, коммитов. ➡️ Блог разработчиков 🐸Библиотека шарписта #async_news

📎 Как считать повторения без условных операторов Нужно посчитать, сколько раз каждое значение встречается в данных. Логично напрашивается проверка:
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

👨‍💻 Demystifier: когда стек-трейс не радует Откройте логи ошибки из продакшена. Видите стек-трейс? Он полон <>c__Disp
👨‍💻 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

📎 Когда тип спасает Представьте, что вы пришли в магазин и продавец говорит: «Вот вам что-то. Не знаю что. Может быть, помидоры, может быть, кирпич, может быть, счастье. Узнаете, когда вернётесь домой». Вот такое же ощущение от 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

Гид по Redis в C# ASP.NET: ускоряем приложения и снижаем нагрузку на базу данных. Redis — быстрая база данных в памяти, котор
Гид по 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

🤨 Когда помощник становится врагом Представьте, что вы отправили друга в магазин с деньгами на общий счёт. Он может потратит
🤨 Когда помощник становится врагом Представьте, что вы отправили друга в магазин с деньгами на общий счёт. Он может потратить их на что угодно, при этом никому не отчитываясь. Вот примерно так же работает static с изменяемым состоянием. Удобно? Да. Безопасно? Совсем нет. Почему static плохо сочетается с данными Static — это ключевое слово, которое любят новички и используют для удобства. А потом из этого вырастают проблемы, которые отъедают часы отладки. Главная беда в том, что статические поля существуют всё время работы программы и доступны отовсюду. Четыре золотых правила 1. Статические поля могут быть только для чтения. Лучше — константы. 2. Статические методы должны работать как математические функции: дали параметры — получили результат. Никаких побочных эффектов, никаких изменений состояния. Например: Select, Where, First из LINQ — это всё статические методы расширения, которые не трогают исходную последовательность. 3. Если в классе есть методы, которые не используют поля экземпляра, эту логику лучше вынести в отдельный статический класс-помощник. Это делает код чище, тесты проще. 4. Если вы создаёте статическое поле, пусть оно указывает на что-то, что не меняется. На объект конфигурации? Хорошо. На список данных, который вы потом модифицируете? Катастрофа. Когда static — ваш друг • Вспомогательные классы с чистыми функциями Создайте статический класс StringUtils с методом static string ToPascalCase(string input). Нет состояния, нет побочных эффектов, нет проблем. Это хорошее использование. • Методы расширения для преобразований Select, Where и компания — статические методы расширения, которые берут данные, преобразуют их и возвращают новые. Функциональный подход, никакого волшебства. • ThreadStatic для действительно отдельного состояния Если каждому потоку нужно своё состояние, можно использовать ThreadStatic. Но даже здесь нужна осторожность — каждый поток всё равно должен управлять своим состоянием. Передайте зависимость через конструктор, используйте DI-контейнер, создайте объект на сессию. Ваш будущий я, сидящий в отладчике в три утра, скажет вам спасибо. 🐸Библиотека шарписта #il_люминатор

⚡️ Пять команд .NET, без которых неудобно Бывает, нужно быстро собрать, запустить или опубликовать проект без запуска тяжелой
⚡️ Пять команд .NET, без которых неудобно Бывает, нужно быстро собрать, запустить или опубликовать проект без запуска тяжелой IDE, особенно в пайплайне или на сервере разработчика. Для этого хватает нескольких команд из .NET CLI, которые работают одинаково на всех платформах. Проверить установку и окружение поможет команда dotnet --info, она покажет версии SDK и рантаймов и архитектуру хоста. Сборка проекта выполняется командой dotnet build, по умолчанию в конфигурации Debug и с выводом артефактов в bin, причем команда учитывает инкрементальные изменения для скорости. Запуск приложения через dotnet run объединяет сборку и старт процесса, что эквивалентно кнопке Run в IDE и удобно для ручных проверок локально. Горячая перезагрузка из терминала через dotnet watch отслеживает изменения файлов и повторно запускает приложение с Hot Reload без ручного рестарта, что ускоряет цикл правка и проверка. Если сборка ведет себя странно, стоит выполнить dotnet clean, чтобы удалить выходные артефакты и заставить следующий build собрать все заново. Для развертывания используйте dotnet publish, который соберет релиз и положит готовый к деплою набор файлов в папку publish, включая веб приложения и сервисы. 🐸Библиотека шарписта #sharp_view

💬 Три дня работы Завтра начнётся самая короткая рабочая неделя ноября. Это буквально понедельник, среда и пятница. После шес
💬 Три дня работы Завтра начнётся самая короткая рабочая неделя ноября. Это буквально понедельник, среда и пятница. После шестидневки самое то. 💬 Что будете делать? Успевать выполнить недельные обязанности за три дня? Или три дня будете пытаться начать работать? 🐸Библиотека шарписта #entry_point

👀 Управление доступом в .NET Если вы работаете с авторизацией в .NET и используете Identity, но всё ещё не совсем понимаете,
👀 Управление доступом в .NET Если вы работаете с авторизацией в .NET и используете Identity, но всё ещё не совсем понимаете, как правильно организовать систему разрешений — есть видео, которое стоит посмотреть. В нём конкретный пример: как взять стандартный ASP.NET Core Identity и использовать его для управления доступом. Ничего экзотического — обычная setup с JWT и кастомным authorization handler. ➡️ Посмотреть видео 🐸Библиотека шарписта #sharp_view

✏️ Задачка с собеса Дано целое число, нужно проверить, является ли оно полным квадратом. Первый рефлекс новичка — взять квадр
✏️ Задачка с собеса Дано целое число, нужно проверить, является ли оно полным квадратом. Первый рефлекс новичка — взять квадратный корень и проверить, целое ли число:
(int)Math.Sqrt(num) * (int)Math.Sqrt(num) == num
Но на собесе после этого последует вопрос: «А можете без встроенной функции?» Вот тогда начинается интересное. Вместо математики используем логику: если x * x = num, то x находится где-то между 1 и num. Сужаем диапазон поиска, пока не найдём точный ответ.
public bool IsPerfectSquare(int num)
{
    long left = 1;
    long right = num;
    
    while (left <= right)
    {
        long mid = (left + right) / 2;
        long square = mid * mid;
        
        if (square == num)
            return true;
        else if (square < num)
            left = mid + 1;
        else
            right = mid - 1;
    }
    
    return false;
}
Есть ещё метод Ньютона для поиска корня — он даже быстрее для больших чисел:
public bool IsPerfectSquare(int num)
{
    long x = num;
    
    while (x * x > num)
    {
        x = (x + num / x) / 2;
    }
    
    return x * x == num;
}
Главное: объясните почему вы выбрали именно этот подход, а не просто скопировали решение. На собесе вас оценивают не только по скорости, а по способности мыслить. ➡️ Попробовать решить 🐸Библиотека шарписта #dotnet_challenge

👨‍💻 Worker Services и Channels вместо сторонних библиотек Каждый разработчик сталкивался с необходимостью выполнять долгие операции в фоне: отправка писем, обработка платежей, генерация отчётов, синхронизация данных. Обычно первая мысль — взять Hangfire, Quartz или Azure Functions. Но .NET 9 предоставляет встроенные примитивы, которые отлично справляются с этой задачей самостоятельно. Традиционные подходы — блокирующая коллекция и самописные очереди имеют недостатки: требуют ручной синхронизации, рискуют блокировкой потоков, не имеют встроенной поддержки обратного давления. Реализуем очередь задач с помощью каналов и фоновые сервисы Интерфейс и реализация очереди:
public interface IBackgroundTaskQueue
{
    ValueTask QueueAsync(Func<CancellationToken, Task> workItem);
    ValueTask<Func<CancellationToken, Task>> DequeueAsync(CancellationToken cancellationToken);
}

public class BackgroundTaskQueue : IBackgroundTaskQueue
{
    private readonly Channel<Func<CancellationToken, Task>> _queue;

    public BackgroundTaskQueue(int capacity = 100)
    {
        var options = new BoundedChannelOptions(capacity)
        {
            SingleReader = false,
            SingleWriter = false,
            FullMode = BoundedChannelFullMode.Wait
        };
        _queue = Channel.CreateBounded<Func<CancellationToken, Task>>(options);
    }

    public async ValueTask QueueAsync(Func<CancellationToken, Task> workItem)
        => await _queue.Writer.WriteAsync(workItem);

    public async ValueTask<Func<CancellationToken, Task>> DequeueAsync(CancellationToken cancellationToken)
        => await _queue.Reader.ReadAsync(cancellationToken);
}
Фоновые сервисы для обработки:
public class BackgroundWorker : BackgroundService
{
    private readonly IBackgroundTaskQueue _taskQueue;
    private readonly ILogger<BackgroundWorker> _logger;

    public BackgroundWorker(IBackgroundTaskQueue taskQueue, ILogger<BackgroundWorker> logger)
    {
        _taskQueue = taskQueue;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Фоновый worker запущен");
        
        while (!stoppingToken.IsCancellationRequested)
        {
            var workItem = await _taskQueue.DequeueAsync(stoppingToken);
            try
            {
                await workItem(stoppingToken);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Ошибка при выполнении задачи");
            }
        }
        
        _logger.LogInformation("Worker останавливается...");
    }
}
Использование в контроллере:
app.MapPost("/send-email", async (IBackgroundTaskQueue queue) =>
{
    await queue.QueueAsync(async token =>
    {
        await Task.Delay(1000, token); // имитация отправки
        Console.WriteLine($"Email отправлен в {DateTime.UtcNow}");
    });
    return Results.Accepted();
});
Запрос возвращается немедленно, а работа продолжается в фоне. Queue автоматически буферизирует задачи, управляет нагрузкой и применяет обратное давление, если очередь переполнится. Когда использовать этот подход Подходит: • Внутренняя обработка задач в приложении • Нет нужды в UI-панели мониторинга • Self-contained сервисы Возьмите библиотеку, если: • Нужна распределённая обработка • Требуется веб-интерфейс для управления • Задачи должны пережить перезагрузку приложения ➡️ Источник 🐸 Библиотека шарписта #sharp_view

❓ Какой пост особенно зашел за эту неделю
Anonymous voting

📰 Шестидневные новости Вспомним, что произошло за 6 рабочих дней. — C# сохраняет популярность Вышел ежегодный Octoverse от G
📰 Шестидневные новости Вспомним, что произошло за 6 рабочих дней. — C# сохраняет популярность Вышел ежегодный Octoverse от GitHub, в котором отмечается рекордный рост числа разработчиков, активность в проектах с AI и смена лидерства по языкам программирования. — Unity Lite. Простой старт в 3D для всех Инструмент от Unity для создания интерактивных 3D-сцен без программирования, с удобной навигацией и редактором внутри браузера/. — Нейросети поиграли в покер Победителем стала модель OpenAI o3 с выигрышем в $36,691 виртуальных денег. Второе место занял Claude Sonnet 4.5, а третье — Grok 4 — Новые кастомные агенты Copilot для .NET GitHub запускает интеллектуальных помощников для оптимизации рабочего процесса .NET‑разработчиков. — Звуки флоппи-дисководов в эмуляторе 🐸 Библиотека шарписта #async_news

☺️ 6 дней труда — пора отдыхать Шестидневная рабочая неделя подошла к концу, и наконец-то время расслабиться. Используйте сво
☺️ 6 дней труда — пора отдыхать Шестидневная рабочая неделя подошла к концу, и наконец-то время расслабиться. Используйте свободное время для восстановления и новых впечатлений. 💬 А вы как планируете провести ближайшие дни? Уже отдыхаете или еще у дел? Ждем ваши ответы в комментариях 👇 🐸 Библиотека шарписта #entry_point

💲 Как договориться о зарплате: 9 стратегий В зарплатных переговорах нет универсального сценария. Но есть проверенные стратег
💲 Как договориться о зарплате: 9 стратегий В зарплатных переговорах нет универсального сценария. Но есть проверенные стратегии под разные ситуации. В статье 9 тактик от открытой до «я никуда не тороплюсь» — с готовыми фразами для собеседования. ➡️ Выбирайте свою в зависимости от опыта, позиции и типа компании 🐸 Библиотека шарписта