ch
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
帖子存档
⚡️ 100 RPS на всё приложение Rate limit — это простой способ защитить API от всплесков нагрузки, случайных «шторма» с клиента и банального DDoS по честным endpoint’ам. В примере ниже на всё приложение вешается глобальный лимитер:
builder.Services.AddRateLimiter(o =>
{
    o.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(ctx =>
        RateLimitPartition.GetFixedWindowLimiter("global", _ =>
            new FixedWindowRateLimiterOptions
            {
                PermitLimit = 100,
                Window = TimeSpan.FromSeconds(1)
            }));
});

app.UseRateLimiter();
Если за текущую секунду лимит исчерпан, новые запросы начнут получать ответ об ограничении, пока не откроется следующее окно. Дальше от этого базового варианта легко прийти к более тонким настройкам: отдельные лимиты на публичные и внутренние маршруты, разделение по API-ключу, IP или пользователю, своя политика ответа и логирование с метриками. 🔹 Алгоритмы и структуры данных 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

👨‍💻 База про менеджмент в разработке Закон Брукса — это принцип управления разработкой ПО, который говорит: если проект уже
👨‍💻 База про менеджмент в разработке Закон Брукса — это принцип управления разработкой ПО, который говорит: если проект уже опаздывает, добавление людей чаще всего только ещё больше задерживает его. Закон сформулировал Фредерик Брукс в книге «Мифический человеко‑месяц». Новичков нужно онбордить: рассказывать контекст, архитектуру, правила команды. Опытные ребята вместо того чтобы закрывать задачи, превращаются в живую документацию и менторов. Параллельно растут коммуникации: больше созвонов, больше согласований, больше мест, где можно неправильно понять требования. В какой‑то момент команда тратит больше времени на разговоры и объяснения, чем на фактическую разработку. Практический вывод простой: «давайте накинем ещё разработчиков» — плохой универсальный ответ на проблему сроков. Гораздо полезнее заранее резать систему на независимые модули, упрощать архитектуру, улучшать документацию и процессы. А если проект уже горит, то честный пересмотр объёма, приоритизация и выкидывание лишнего часто работают лучше, чем срочный найм. 🔹 Основы IT для непрограммистов 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #il_люминатор

⚙️ Как повысить надёжность конфигурации В современных приложениях важно не только загрузить настройки из конфигурации, но и убедиться, что они корректны. В .NET для этого есть удобный паттерн — Typed Options с встроенной валидацией. Пример регистрации опций с проверкой данных:
builder.Services.AddOptions<AppOptions>()
    .BindConfiguration("App")
    .ValidateDataAnnotations() // Валидация по атрибутам из System.ComponentModel.DataAnnotations
    .Validate(o => Uri.IsWellFormedUriString(o.ApiBaseUrl, UriKind.Absolute),
        "ApiBaseUrl must be absolute") // Дополнительная кастомная проверка
    .ValidateOnStart(); // Проверка при старте приложения
Что здесь происходит: • Конфигурация из секции App автоматически связывается с классом AppOptions. • Включена проверка на основе Data Annotations — атрибуты вроде [Required], [Range] в AppOptions валидируются автоматически. • Добавлена кастомная валидация, которая гарантирует, что значение ApiBaseUrl — корректный абсолютный URI. • ValidateOnStart() заставляет приложение валидировать настройки сразу при запуске, а не при первом использовании. 🔹 Специалист по ИИ 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

👀 Бритни, лазеры и полупроводники Наткнулись на старый веб-артефакт — сайт, где Бритни Спирс читает курс по полупроводниковы
👀 Бритни, лазеры и полупроводники Наткнулись на старый веб-артефакт — сайт, где Бритни Спирс читает курс по полупроводниковым лазерам и оптоэлектронике. Внутри не мем на один экран, а вполне учебные разборы p–n переходов, лазерных диодов и VCSEL, просто завернутые в эстетику фан-сайта двухтысячных. Если хочется отвлечься от документации по фреймворкам и заодно освежить базу по полупроводниковым лазерам, эта старая страница сделает день чуть веселее. ➡️ Почитать курс от Бритни 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта

📰 Декабрьский дайджест Админ ждёт снега и собирает новости недели в кучу. — Microsoft объясняет сложности управления горячим
📰 Декабрьский дайджест Админ ждёт снега и собирает новости недели в кучу. — Microsoft объясняет сложности управления горячими клавишами в Visual Studio 2026 Microsoft подчёркивает, что изменение горячих клавиш в Visual Studio 2026 — сложная задача из-за поддержки нескольких комбинаций для одной команды, профилей разработчиков и последовательных шорткатов. — Бывший разработчик Microsoft потоптал Windows 11 Дейв Пламмер считает, что сейчас Windows 11 страдает от багов в обновлениях, вроде исчезновения иконки пароля на экране блокировки и дублирования процессов в Диспетчере задач. — Microsoft предостерегает админов от устаревших .NET рантаймов В официальном блоге Microsoft рекомендует срочно проверить наличие устаревших рантаймов и перейти на поддерживаемые версии. — Баг в интерфейсе Windows 11 24H2 и 25H2 🔹 Программирование на языке Python 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #async_news

Как правильно реализовать освобождение ресурсов в IAsyncDisposable? Короткий ответ: Реализуйте шаблон с охраной от повторного вызова: DisposeAsync() вызывает приватный DisposeAsyncCore() и синхронный Dispose(false), закрывает IAsyncDisposable ресурсы через await using, остальные — в Dispose. Используйте AsyncLazy/флаг disposed, прокидывайте CancellationToken только там, где это безопасно, и учитывайте, что await using всегда вызывает именно DisposeAsync(). 🔹 Курс «Программирование на языке Python» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib Библиотека собеса по С#

✏️ Задача без подвоха Дан массив длиной 2n в виде [x1,x2,xn,y1,y2,yn] нужно вернуть массив [x1,y1,x2,y2,xn,yn], то есть перемешать. Идея решения Логически делим массив на две половины по n элементов и в одном цикле по индексу i собираем ответ в новый массив result. На каждой итерации кладем сначала элемент из первой половины nums[i] потом из второй nums[i+n]. Так мы проходим вход один раз время O(n), где n это половина массива. Решение:
public class Solution
{
    public int[] Shuffle(int[] nums, int n)
    {
        int[] result = new int[2 * n];
        int index = 0;

        for (int i = 0; i < n; i++)
        {
            result[index++] = nums[i];
            result[index] = nums[i + n];
            index++;
        }

        return result;
    }
}
Ключевой момент в том что мы никогда не выходим за границы первая половина идет по индексам от нуля до n минус один вторая от n до 2n минус один, а индекс в result просто сдвигается на два шага за итерацию. ➡️ Попробовать решить 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #dotnet_challenge

C# мощный, но математика универсальна ML.NET развивается, но фундамент Data Science остаётся неизменным. Чтобы эффективно раб
C# мощный, но математика универсальна ML.NET развивается, но фундамент Data Science остаётся неизменным. Чтобы эффективно работать с данными (даже в .NET-среде), нужно понимать линейную алгебру и статистику. Мы добавили живые вебинары в наш курс по математике для AI. Программа ближайших лекций:Vectors & Matrices: операции, ранги, СЛАУ; — Linear Regression: реализация МНК, интерпретация весов; — SVD: матричные разложения и рекомендательные системы. Практика на Python (NumPy), но алгоритмическая суть переносится на любой язык. Регистрация закрывается 9 декабря: https://clc.to/LojFzw

🧑‍💻 Честность в айти — это грех В айти часто говорят, что честность — это слабость. Многие накручивают опыт, преувеличивают
🧑‍💻 Честность в айти — это грех В айти часто говорят, что честность — это слабость. Многие накручивают опыт, преувеличивают достижения и скрывают ошибки, чтобы выглядеть лучше в резюме. Но без честности не бывает доверия и настоящего развития. Признание своих ошибок и реальных навыков помогает учиться и двигаться вперед, а не строить пирамиду из лжи. 💬 Как думаете лучше приврать или сказать как есть? Где ложь во благо, а где во вред? Делитесь в комментах своими размышлениями 👇 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #entry_point

🔄 Отмена запросов в EF В реальных приложениях бывают ситуации, когда нужно прервать долгую операцию с базой данных, если она больше не актуальна или пользователь отменил действие. Долгие запросы или операции сохранения могут повиснуть или перерасходовать системные ресурсы, если не предусмотрена возможность прерывания. В Entity Framework для управления отменой используется CancellationToken. Его можно передавать в асинхронные методы, например:
await db.SaveChangesAsync(ct);
Переданный CancellationToken позволяет прервать выполнение метода, если операция была отменена. 🔹 Математика для Data Science 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

🔑 Управление HttpClient по ключам С .NET 9 можно управлять зависимостями по ключам. Буквально регистрировать и получать, к примеру, конфиги для HttpClient. Как это работаетAddAsKeyed() — новый метод расширения для регистрации именованных HttpClient как Keyed Service в DI. Имя клиента становится ключом, по которому можно получать конкретный экземпляр. • Внедрение осуществляется с помощью атрибута [FromKeyedServices("key")] или через Func<string, HttpClient> для динамического выбора клиента по ключу. • В отличие от старых подходов с именованными или типизированными клиентами, внедрение зависимостей по ключам позволяет упростить код и уменьшить лишние вызовы фабрики IHttpClientFactory. Пример регистрации и использования:
var builder = WebApplication.CreateBuilder(args);

// Регистрация HttpClient с ключом "github"
builder.Services.AddHttpClient("github", c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    c.DefaultRequestHeaders.Add("User-Agent", "dotnet");
})
.AddAsKeyed();

var app = builder.Build();

// Внедрение HttpClient по ключу "github"
app.MapGet("/", ([FromKeyedServices("github")] HttpClient httpClient) =>
{
    return httpClient.GetFromJsonAsync<Repo>("/repos/dotnet/runtime");
});

app.Run();

record Repo(string Name, string Url);
Преимущества Keyed DI • Минимизирует необходимость вручную создавать и хранить экземпляры через IHttpClientFactory. • Позволяет внедрять в сервисы и контроллеры правильно настроенные клиенты с простым указанием ключа. • Улучшает читаемость и поддержку кода, особенно если в проекте много разных конфигураций HttpClient. • Можно глобально включить ключевой DI для всех клиентов через ConfigureHttpClientDefaults. Важные моменты • По умолчанию AddAsKeyed() регистрирует HttpClient с областью видимости Scoped, но можно настроить и другой жизненный цикл. • Нужно внимательно следить за временем жизни сервисов, чтобы избежать утечек памяти и проблем с соединениями. • При ошибочном использовании ключа сервис выдаст стандартное исключение, помогая быстро находить и исправлять конфигурационные ошибки. 🔹 ML для старта в Data Science 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #il_люминатор

❗️ Microsoft признала масштабный баг в интерфейсе Windows 11 24H2 и 25H2 У части пользователей Windows 11 после установки пос
❗️ Microsoft признала масштабный баг в интерфейсе Windows 11 24H2 и 25H2 У части пользователей Windows 11 после установки последних обновлений в версиях 24H2 и 25H2 начали ломаться ключевые элементы интерфейса. Проблема затрагивает базовые функции оболочки и выглядит как обычный «заглючивший» рабочий стол, но на деле связана с ошибками в самих системных компонентах. Временное решение — установка актуальных патчей, использование опубликованных обходных скриптов или откат проблемных обновлений, если интерфейс стал нестабильным после апдейта. ➡️ Источник новости 🔹 Математика для разработки AI-моделей 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #async_news

👨‍💻 Поддержка and! в task-вычислениях F# 10 В F# 10 библиотека FSharp.Core получила улучшение — поддержку оператора and! в вычислительном выражении task. Раньше, чтобы ждать несколько задач параллельно, нужно было либо ждать их последовательно:
task {
    let! a = fetchA()
    let! b = fetchB()
    return combineAB a b
}
Либо использовать Task.WhenAll для ожидания сразу всех:
task {
    let ta = fetchA()
    let tb = fetchB()
    let! results = Task.WhenAll([| ta; tb |])
    return combineAB ta.Result tb.Result
}
Первый вариант простой, но последовательный, второй — параллельный, но сложнее по синтаксису. Теперь с оператором and! можно одновременно ждать несколько задач легко и понятно:
task {
    let! a = fetchA()
    and! b = fetchB()
    return combineAB a b
}
Это сочетает простоту первого примера с параллельным исполнением из второго. Код становится компактным и выразительным. 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

⚙️ Используйте AsNoTracking() для запросов только на чтение Если нужно получить данные из базы без их изменения, лучше использовать AsNoTracking():
var posts = await db.Posts.AsNoTracking()
    .Where(p => p.Published)
    .ToListAsync(ct);
Метод AsNoTracking() говорит Entity Framework не отслеживать изменения для полученных объектов. 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

Math for .NET Developers Использовать ML.NET или Accord.net — это полдела. Чтобы кастомизировать модели и понимать, почему се
Math for .NET Developers Использовать ML.NET или Accord.net — это полдела. Чтобы кастомизировать модели и понимать, почему сеть не сходится, нужно лезть под капот. Там живут матрицы, производные и векторы. Завтра стартуем курс «Математика для разработки AI-моделей». 🛠 Темы: Линал, матан, теорвер. 💸 Цена: 28 200 ₽ (новогодний прайс). ⏱ Дедлайн: Старт завтра. Интегрируйте знания в свой стек: 🔗 Ссылка на курс Debug your math: @proglib_academy_webinar_bot

🛠 .NET MAUI и работа с возрастом С началом 2026 года в США вступают в силу новые требования по верификации возраста пользова
🛠 .NET MAUI и работа с возрастом С началом 2026 года в США вступают в силу новые требования по верификации возраста пользователей для мобильных и десктопных приложений. Да, это затрагивает несколько штатов в США, но стоит держать руку на пульсе. .NET MAUI предоставляет удобный способ решения этой задачи с помощью единого интерфейса IAgeSignalService и трёх платформо-специфичных реализаций: • Для Android используется Google Play Age Signals API, который возвращает пять статусов в зависимости от ситуации: от подтверждённого возраста до ожидания одобрения опекуна. • На iOS применяется Apple Declared Age Range API, работающий на устройствах с iOS 26 и выше, отображающий возрастной диапазон и информацию о том, кто его подтвердил — сам пользователь или опекун. • Windows предлагает Windows Age Consent API с упрощённой классификацией пользователей на три категории: ребёнок, несовершеннолетний и взрослый. Главное преимущество — единая точка интеграции и адаптация под каждый API за счёт условной компиляции и инъекции зависимостей. Достаточно подключить сервис в MauiProgram, чтобы обеспечить проверку возраста на нужной платформе. ➡️ Блог Microsoft 🔹 AI-агенты для DS-специалистов 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

🛠 Строгая проверка назначения атрибутов в F# 10 В F# 10 компилятор стал жёстко проверять, что атрибуты применяются только к тем конструкциям, для которых они предназначены. Это касается функций, значений, объединений, конструкторов, структур, классов и других элементов. Раньше F# позволял неявно применять атрибуты к неподходящим целям без предупреждений. Из-за этого возникали баги, например: • Тестовые атрибуты не работали, если функция не имела (), и тесты не запускались • Атрибуты-анализаторы иногда игнорировались, приводя к сбоям в CI без очевидной причины. Пример такого кода, который никак не работал:
[<Fact>]
let ``this is not a function`` =  // никак не запускался тест
    Assert.True(false)
Теперь компилятор выдаёт предупреждение при неверном применении атрибутов:
[<Fact>]
//^^^^ предупреждение FS0842: атрибут нельзя применять к свойству, полю и т.п.
let ``works correctly`` =
    Assert.True(true)
Атрибуты должны применяться только к совместимым элементам, например, к методам. 🔹 Алгоритмы и структуры данных 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #sharp_view

🧑‍💻 Проекция колонок вместо сущностей в запросах Когда работаете с базой данных, лучше получить только нужные поля, а не всю сущность. Это ускорит запросы и снизит объём передаваемых данных. Пример проекции колонок с использованием LINQ:
var dto = await db.Users
    .Where(u => u.Id == id)
    .Select(u => new UserDto(u.Id, u.Name))
    .SingleOrDefaultAsync(ct);
Здесь из таблицы пользователей выбираются только Id и Name, которые помещаются в объект UserDto. 🔹 ML для старта в Data Science 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🐸Библиотека шарписта #il_люминатор