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

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

Відкрити в Telegram

Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

Показати більше

📈 Аналітичний огляд Telegram-каналу Библиотека шарписта | C#, F#, .NET, ASP.NET

Канал Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 21 866 підписників, посідаючи 6 209 місце в категорії Технології та додатки та 30 824 місце у регіоні Росія.

📊 Показники аудиторії та динаміка

З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 21 866 підписників.

За останніми даними від 11 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -95, а за останні 24 години на -6, загальне охоплення залишається високим.

  • Статус верифікації: Не верифікований
  • Рівень залученості (ER): Середній показник залученості аудиторії становить 12.48%. Протягом перших 24 годин після публікації контент зазвичай збирає 7.13% реакцій від загальної кількості підписників.
  • Охоплення публікацій: В середньому кожен допис отримує 2 729 переглядів. Протягом першої доби публікація в середньому набирає 1 560 переглядів.
  • Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 9.
  • Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як .net, шарписта, навигация, await, string.

📝 Опис та контентна політика

Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

Завдяки високій частоті оновлень (останні дані отримано 12 червня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.

21 866
Підписники
-624 години
-237 днів
-9530 день
Архів дописів
💃 Волшебство для больших проектов Partial классы — это C#-хакинг, который разбивает один класс на несколько файлов, не ломая компиляцию. Идеально для автогенерации, командной работы и масштабирования монстров-кода. Представьте: WinForms или WPF дизайнер генерирует кучу кода в .Designer.cs, а вы хотите добавить свою логику. Без partial пришлось бы вручную мержить изменения или наследоваться с кучей override. Partial решает это элегантно — основной класс в вашем файле, автокод в отдельном. Все части класса должны иметь одинаковые модификаторы доступа и использовать ключевое слово partial. Компилятор проверит согласованность. Живой пример:
// Employee.Core.cs — базовая структура
public partial class Employee
{
    public string Name { get; set; }
    public decimal Salary { get; set; }
    
    public partial void ValidateName();
    public partial void ValidateSalary();
    
    public void Hire()
    {
        ValidateName();
        ValidateSalary();
        Console.WriteLine($"{Name} нанят с зарплатой {Salary:C}!");
    }
}

// Employee.Validation.cs — бизнес-правила
public partial class Employee
{
    public partial void ValidateName()
    {
        if (string.IsNullOrWhiteSpace(Name) || Name.Length < 2)
            throw new ArgumentException("Имя должно быть не короче 2 символов!");
    }
    
    public partial void ValidateSalary()
    {
        if (Salary < 50000) throw new ArgumentException("Зарплата не может быть ниже 50k!");
    }
}

// Employee.Extensions.cs — расширения (опционально)
public partial class Employee
{
    public void Promote() => Salary *= 1.2m;
}
Partial методы уникальны: если реализация отсутствует, метод полностью удаляется из IL. Идеально для опциональных хуков в генерируемом коде. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

🧑‍🎓 Диплом = 15% к зарплате Диплом в IT вещь нестабильная. Одним подавай три профильных, чтобы устроиться, другие косо взгл
+5
🧑‍🎓 Диплом = 15% к зарплате Диплом в IT вещь нестабильная. Одним подавай три профильных, чтобы устроиться, другие косо взглянут на любой диплом, который не из МФТИ. В карточках собрали факты про эту корочку. Листайте и проверяйте сколько вам можно накинуть за диплом. ➡️ Полный материал 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта

🎓 Твой опыт стоит дорого — стань экспертом Proglib Academy Чувствуешь, что накопил достаточно знаний, чтобы делиться ими с д
🎓 Твой опыт стоит дорого — стань экспертом Proglib Academy Чувствуешь, что накопил достаточно знаний, чтобы делиться ими с другими? Мы ищем сильных практиков, которые хотят попробовать себя в роли: — преподавателей; — авторов курсов; — наставников. Это возможность не только монетизировать экспертизу, но и прокачать личный бренд, структурировать собственные знания и вырастить новое поколение специалистов. 👉 Заполни короткую анкету

✏️ Вопрос с собеса Админ принёс актуальный вопрос, который ему задали вчера на собеседовании. Чем отличаются IQueryable<T> и IEnumerable<T> помимо синтаксиса? Можете оставить свой ответ в комментариях и сравнить его с нашим. 👉 Посмотреть ответ в нашем канале с задачами 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #dotnet_challenge

📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #garbage_collector
📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #garbage_collector

😁 Он вам не веб-сервис Вы замечали, что Windows работает не так, как раньше? Это всё из-за новомодных ИИ и веб-элементов. Пе
😁 Он вам не веб-сервис Вы замечали, что Windows работает не так, как раньше? Это всё из-за новомодных ИИ и веб-элементов. Первое пишет, а второе лагает. Наткнулись на видео, где всё это выпиливают из актуальной Windows 11. Результат вас не порадует, но зато вы узнаете на что конкретно жаловаться в Microsoft. ➡️ Смотреть видео 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

💻 Свежий контент для Copilot Проблема с Copilot: он не знает о новых штуках вроде Agent Framework. Решение от Microsoft: MCP
💻 Свежий контент для Copilot Проблема с Copilot: он не знает о новых штуках вроде Agent Framework. Решение от Microsoft: MCP сервер дает доступ к свежей .NET-документации прямо в инструментах разработки. Сервер передает Copilot актуальные данные: гайды, код, уроки. Идеально для .NET 10, Aspire или оптимизации старых приложений. Контекст адаптируется под код. ➡️ Как всё это настроить 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

🔍 Подборка ИИ-инструментов для поиска работы за рубежом На сайте Библиотеки программиста вышла обновлённая подборка AI серви
🔍 Подборка ИИ-инструментов для поиска работы за рубежом На сайте Библиотеки программиста вышла обновлённая подборка AI сервисов для тех, кто хочет искать работу в IT за пределами своей страны. Вместо того чтобы пытаться вручную тянуть LinkedIn, job‑борды и подготовку к интервью, имеет смысл собрать для себя связку из нескольких AI сервисов и переложить на них максимум рутины. ➡️ Список сервисов 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта

💲 Дорогое логирование только в dev Иногда нужно навесить на код тяжёлую отладочную диагностику, но в проде за неё платить не хочется. Для таких случаев есть атрибут Conditional, который полностью выкидывает вызовы метода из Release сборки. Базовый пример:
[Conditional("DEBUG")]
public static void Trace(string message)
{
    Console.WriteLine("[TRACE] " + message);
}
Это удобно для временного трассинга, сложных проверок и дорогих assert’ов, которые нужны только при разработке. Debug.Assert и Debug.WriteLine работают так же — они помечены [Conditional("DEBUG")], поэтому автоматически исчезают из релизной сборки. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #il_люминатор

⚙️Паттерн пагинации и фильтрации через один запрос и нормальные DTO Пагинация в API часто превращается либо в магию репозиториев, либо в жуткий копипаст. Лучше держать всё предельно простым: один запрос с фильтрами, подсчётом и проекцией в DTO. Что вообще хотим от пагинации Когда фронт просит список пользователей, ему нужно не только «20 штук с offset», а нормальные данные • Текущая страница. • Размер страницы. • Список элементов. • Общее количество записей под этими фильтрами. Контейнер для любого списка: пользователей, заказов или логов.
public sealed record Paginated<T>(
    IReadOnlyList<T> Items,
    int Page,
    int Size,
    int Total
);
• Items то, что реально отображаем. • Page номер текущей страницы. • Size сколько элементов на странице. • Total сколько записей всего под заданным фильтром. Зачем DTO, а не сущность из EF • EF сущность часто содержит поля, которые нельзя светить наружу (пароли, внутренние флаги, технические поля). • DTO можно менять отдельно от внутренней модели база может жить своей жизнью, а API остаётся стабильным. • EF Core умеет проецировать прямо в DTO через Select, не тянуть все поля сущности и не включать трекинг. В итоге хендлер не выкидывает наружу сырые сущности, а отдаёт ровно то, что нужно клиенту. Как выглядит запрос сверху
public sealed record SearchUsersQuery(
    string? Q,
    int Page = 1,
    int Size = 20
) : IRequest<Paginated<UserSummary>>;
• Q — строка поиска. • Page — номер страницы. • Size — размер страницы. Контроллер ничего не знает о базе и EF он просто пробрасывает запрос в Application слой:
[HttpGet]
public async Task<ActionResult<Paginated<UserSummary>>> Search(
    [FromQuery] string? q,
    [FromQuery] int page,
    [FromQuery] int size,
    ISender sender,
    CancellationToken ct
)
{
    var result = await sender.Send(new SearchUsersQuery(q, page, size), ct);
    return Ok(result);
}
Что делает хендлер под капотом
public async Task<Paginated<UserSummary>> Handle(
        SearchUsersQuery query,
        CancellationToken ct)
    {
        var users = _db.Users.AsQueryable();

        if (!string.IsNullOrWhiteSpace(query.Q))
        {
            var q = query.Q.Trim();
            users = users.Where(u =>
                u.Email.Contains(q) ||
                u.Name.Contains(q));
        }

        var total = await users.CountAsync(ct);

        var items = await users
            .OrderBy(u => u.Email)
            .Skip((query.Page - 1) * query.Size)
            .Take(query.Size)
            .AsNoTracking()
            .Select(u => new UserSummary(
                u.Id,
                u.Email,
                u.IsActive
            ))
            .ToListAsync(ct);

        return new Paginated<UserSummary>(
            items,
            query.Page,
            query.Size,
            total
        );
    }
AsQueryable() чтобы можно было постепенно навешивать фильтры. • Фильтрация по Q делается в базе, а не в памяти. Email и Name фильтруются прямо в SQL. ​• CountAsync считает Total для уже отфильтрованного набора, без Skip/Take. Это количество строк, которые удовлетворяют фильтрам. • Skip и Take делают пагинацию на стороне БД через OFFSET / FETCH или аналог, а не в памяти приложения. • AsNoTracking() говорит EF Core не отслеживать сущности в change tracker, что ускоряет чистые запросы на чтение. • Select сразу проецирует в UserSummary EF не создаёт полноценные сущности, не подгружает лишние поля и не собирает сложные графы. Всё это превращается в один адекватный SQL запрос, а не в серию SELECT * плюс ручная фильтрация и подсчёты. Паттерн пагинации это не про сложность, а наоборот про простоту и предсказуемость. Отдельные DTO, контейнер Paginated<T>, один явный запрос с фильтрами, подсчётом и AsNoTracking() дают API, которое не врёт клиенту, хорошо масштабируется и остаётся читабельным через год. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

IDE-навигация для C# прямо в браузере Привычка к мощным инструментам вроде Visual Studio или Rider делает работу с «голым» текстом в веб-интерфейсе GitLab мучительной. Особенно когда в пулл-реквесте нужно провалиться в определение класса или найти все использования метода, чтобы убедиться, что рефакторинг ничего не сломал. На платформе SourceCraft для C# проектов реализована полноценная навигация по коду. Система строит семантический индекс, позволяя использовать Go to Definition и Find Usages непосредственно в окне просмотра пулл-реквеста. Это избавляет от необходимости стягивать ветку локально при проверке. Посмотрите, как это работает на практике → https://sourcecraft.dev/code-navigation-demo/uikit/pr/2040

🏆 Подборка топ-вакансий для шарпистов за неделю C#/.NET-разработчикот 200 000 ₽ и удалёнка. Senior .NET Engineer до 5 000 $ на гибрид в Минске. Senior .NET Software Engineer до 7 000 $ удалённо. С такими деньгами легко можно попасть в топ 3% разрабов по ЗП. Бустер — Удалённо (в любом городе мира). ➡️ Еще больше топовых вакансий — в нашем канале C# Jobs 🐸 Библиотека шарписта

⚙️Паттерн пагинации и фильтрации через один запрос и нормальные DTO Пагинация в API часто превращается либо в магию репозиториев, либо в жуткий копипаст. Лучше держать всё предельно простым: один запрос с фильтрами, подсчётом и проекцией в DTO. Что вообще хотим от пагинации Когда фронт просит список пользователей, ему нужно не только «20 штук с offset», а нормальные данные • Текущая страница. • Размер страницы. • Список элементов. • Общее количество записей под этими фильтрами.
public sealed record Paginated<T>(
    IReadOnlyList<T> Items,
    int Page,
    int Size,
    int Total
);
Это контейнер для любого списка: пользователей, заказов или логов. Items то, что реально отображаем. Page номер текущей страницы. Size сколько элементов на странице. Total сколько записей всего под заданным фильтром. 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

🛠 Инструмент для трассировки без шума в коде В 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_люминатор

🎁 Письмо Деду Морозу До Нового Года 15 дней! Что бы вы хотели получить в подарок? Годовая премия не в счёт, это всегда как р
🎁 Письмо Деду Морозу До Нового Года 15 дней! Что бы вы хотели получить в подарок? Годовая премия не в счёт, это всегда как рулетка — повезёт/не повезёт. Админ хотел бы набор оперативной памяти, желательно гига 32, откладывал до последнего и вот итог.. 💬 Делитесь своими хотелками или сразу вишлистами в комментах 👇 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #entry_point

👨‍💻 Microsoft показали рабочий рецепт iOS виджетов В официальном .NET блоге появилась большая статья о том как собирать iOS
👨‍💻 Microsoft показали рабочий рецепт iOS виджетов В официальном .NET блоге появилась большая статья о том как собирать iOS виджеты поверх .NET MAUI не теряя нативности. Автор делится практическим опытом, который раньше приходилось выкапывать по кускам в доках Apple и чужих репозиториях. Статья не пошаговый туториал, а набор ключевых шагов и граблей от настроек App Groups и bundle id до интеграции Xcode виджет расширения в MAUI проект. ➡️ Читать статью 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

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

🚦 SemaphoreSlim в проде — не просто «асинхронный lock» SemaphoreSlim часто кидают в код как самое простое решение и успокаив
🚦 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_люминатор

Сборщик мусора для старых знаний В экосистеме .NET всё меняется, но фундамент вечен. Если чувствуешь, что уперся в потолок се
Сборщик мусора для старых знаний В экосистеме .NET всё меняется, но фундамент вечен. Если чувствуешь, что уперся в потолок сеньорити, пора инвестировать в хард-скиллы, а не просто учить новый синтаксис C 12. Оффер 1 + 2: Покупаешь один курс (по старшей цене) — получаешь доступ к трем. Выбор .NET-комьюнити: — архитектуры и шаблоны проектирования (SOLID, GRASP и вот это всё); — алгоритмы и структуры данных. Скомпилировать успех Акция до 31 декабря. NullReferenceException при выборе? Пиши сюда: @manager_proglib

👨‍💻 Не хватает комментария «Создаёт переменную x равную 10» 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта
👨‍💻 Не хватает комментария «Создаёт переменную x равную 10» 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #garbage_collector