en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

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

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

Open in Telegram

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

Show more

📈 Analytical overview of Telegram channel Библиотека шарписта | C#, F#, .NET, ASP.NET

Channel Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) in the Russian language segment is an active participant. Currently, the community unites 21 562 subscribers, ranking 6 153 in the Technologies & Applications category and 30 464 in the Russia region.

📊 Audience metrics and dynamics

Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 21 562 subscribers.

According to the latest data from 26 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -105 over the last 30 days and by -8 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 14.32%. Within the first 24 hours after publication, content typically collects 7.43% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 3 087 views. Within the first day, a publication typically gains 1 603 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
  • Thematic interests: Content is focused on key topics such as .net, шарписта, навигация, await, string.

📝 Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
“Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”

Thanks to the high frequency of updates (latest data received on 27 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.

21 562
Subscribers
-824 hours
-277 days
-10530 days
Posts Archive
🧠 When и Unless для умных проверок В FluentValidation условная валидация запускает правила только при нужных условиях. When и Unless экономят циклы и делают валидаторы читаемыми. • When = «проверить, если условие верно» • Unless = «проверить, если условие НЕ верно» Пример:

RuleFor(x => x.ShippingAddress)
    .NotEmpty()
    .When(x => x.DeliveryMethod == "Express");

RuleFor(x => x.CreditCard)
    .NotEmpty()
    .Unless(x => x.PaymentMethod == "PayPal");
When проверяет условие перед правилом. Express доставка требует адрес, PayPal не требует карту. Логика в одном месте без if-else в контроллере. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy вырастут на 20% 👀 Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц 😏 📍 Выбрать курс

🌞 Готовим вебинар про AI в разработке и хотим сделать его максимально полезным
Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?
🤩 Пишите вопросы в комментариях — самые залайканные разберём на вебинаре в первую очередь. Задавайте всё, что давно хотелось спросить 📍 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта

Команды ждут тебя на треке программирование роботов на МТС True Tech Champ 2026 — всероссийском чемпионате по программировани
Команды ждут тебя на треке программирование роботов на МТС True Tech Champ 2026  — всероссийском чемпионате по программированию с двумя треками и призовым фондом 10 250 000 рублей. Успей зарегистрироваться до 13 сентября. В треке программирования роботов тебе предстоит запрограммировать робособаку для доставки груза через полосу препятствий сначала в онлайн-симуляторе, а затем на офлайн-полигоне в финале 22 октября. Рекомендуемые стеки: Go, Java, Python, C#, C++, JS. Участие в командах 2-5 человек. Если у тебя нет своей команды, кураторы помогут объединиться с другими участниками на платформе. Масштабный финал объединит борьбу за призовой фонд 10 250 000 рублей, выступления хедлайнеров, доклады спикеров и активности для всех гостей мероприятия. Успей зарегистрироваться и пройти квалификацию до 13 сентября. erid:2VSb5xEgRdt

✏️ Async/Await в C# — шпаргалка ➡️ Что такое Task Task — это обещание, что какое-то событие произойдёт в будущем. Не результат, а именно обещание. Task<T> — то же самое, но с результатом типа T. Когда задача завершится, значение станет доступно. Задача считается завершённой, когда событие произошло или значение получено. Проверить это можно через IsCompleted или Status. ➡️ Как дождаться результата Правильно — асинхронно: • await task — отпускает поток, пока задача не завершится. Поток свободен, приложение не зависает. • ContinueWith(action) — задача сама вызовет ваш колбэк, когда завершится. Полезно, если нужно выстроить цепочку без await. Неправильно — синхронно: • task.Wait() и task.Result блокируют текущий поток до завершения задачи. Это неэффективно, ведь поток простаивает и опасно: риск дедлока в UI и ASP.NET-контекстах. Единственное исключение: вызывать Wait или Result на уже завершённой задаче безопасно и дёшево — результат уже есть, блокировки не будет. ➡️ Что делает async async — это флаг для компилятора: «в этом методе может встретиться await, подготовь конечный автомат». Не более того. async без await внутри — бессмысленный метод. Он выполнится полностью синхронно, а компилятор при этом сгенерирует тяжёлый шаблонный код конечного автомата впустую. async не запускает код в фоновом потоке. Если нужен фоновый поток — используйте Task.Run. ➡️ Что делает await await — точка, в которой метод «разрезается» на до и после. Если задача ещё не завершена, управление возвращается вызывающему коду. Когда задача завершится — выполнение продолжится с того же места. Без await ключевое слово async ничего не делает. ➡️ Частые ошибки Вызов .Result или .Wait() в UI-потоке — дедлок. UI-поток заблокирован ожиданием, а задача не может завершиться, потому что ей нужен тот же UI-поток. async void — допустим только для обработчиков событий. В остальных случаях используйте async Task. Исключения из async void невозможно поймать извне. Забыли await — задача запустится, но никто не дождётся её завершения. Ошибки внутри неё потеряются молча. async без await — компилятор предупредит, и правильно сделает. Метод синхронный, а обёртка в Task создаёт ложные ожидания у вызывающего кода. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

🚀 .NET 11 вышел в Release Candidate 1 8 сентября Microsoft выпустила первый RC .NET 11. У него уже есть Go-Live Support, поэ
🚀 .NET 11 вышел в Release Candidate 1 8 сентября Microsoft выпустила первый RC .NET 11. У него уже есть Go-Live Support, поэтому сборку можно использовать в production — хотя для критичных систем разумнее дождаться финального релиза. Что главное:
→ C# 15 стал default для .NET 11 — union types и closed hierarchies больше не preview; → runtime получил новые возможности для диагностики и оптимизации, включая crash reporting на Unix и аппаратное ускорение System.Half; → обновились SDK, MSBuild, NuGet, ASP.NET Core, MAUI и WinForms.
🌞 Финальный .NET 11 запланирован на 10 ноября и будет STS-релизом. А 10 ноября заканчивается поддержка .NET 8 и .NET 9. Для них уже вышли сентябрьские security updates: 8.0.31, 9.0.20 и 10.0.12. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news

💥 Куда исчезает метод после JIT-компиляции? В C# мы пишем:
int Double(int x) => x * 2;

var result = Double(21);
Но JIT может решить, что отдельный вызов здесь вообще не нужен. При inlining тело метода встраивается непосредственно в вызывающий код: 🔴 До:
call Double
↓
x * 2
🔴 После:
21 * 2
Зачем? Меньше накладных расходов на вызов метода, а главное — JIT получает больше кода для последующих оптимизаций. Но inline не означает «метод маленький → обязательно встроить». JIT учитывает размер метода, частоту вызовов, доступность кода для анализа и другие эвристики. Поэтому даже небольшой метод может не попасть в inline. 📍 А атрибут:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
— это подсказка JIT, а не приказ. И наоборот, иногда большой метод всё-таки может быть встроен, если JIT считает это выгодным. Вот почему производительность C# нельзя оценивать только по исходному коду: между C# и CPU есть ещё один слой — JIT и его оптимизатор. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #il_люминатор

🧪 MSTest 4.4 теперь поддерживает Native AOT Тесты тоже должны проверять то, что мы отправляем в production. Native AOT означает trimming, ограничения reflection и отсутствие runtime code generation. Обычный managed-тест может этого не показать. В MSTest 4.4 появился source generation для тестов — test discovery и запуск можно выполнять без зависимости от runtime reflection.

<PublishAot>true</PublishAot>
В итоге можно прогнать тесты в тех же AOT-условиях, в которых будет работать приложение. Особенно полезно для проектов, где Native AOT — часть production-сборки. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news

💡 FrozenDictionary. Когда словарь больше не должен меняться Если коллекция после создания больше не изменяется, обычный Dictionary<TKey, TValue> не всегда лучший вариант. В .NET 8 появились FrozenDictionary и FrozenSet — специализированные неизменяемые коллекции для сценариев, где данные сначала собираются, а потом много раз читаются.

var users = new Dictionary<int, string>
{
    [1] = "Ada",
    [2] = "Linus",
    [3] = "Grace"
};

var frozenUsers = users.ToFrozenDictionary();
После создания frozenUsers нельзя изменить. Зато структура оптимизируется именно под быстрый поиск. 🟡 Хороший сценарий — конфигурация, справочники, таблицы маршрутизации или наборы разрешений, которые загружаются один раз и затем используются тысячи раз. FrozenDictionary не означает «быстрее любого Dictionary». Создание такой коллекции дороже, поэтому выигрыш появляется именно там, где чтений много, а изменений нет. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

👨‍💻 string в C# — не просто текст string — это ссылочный тип с особой поддержкой рантайма. Внутри он хранит непрерывный бло
👨‍💻 string в C# — не просто текст string — это ссылочный тип с особой поддержкой рантайма. Внутри он хранит непрерывный блок UTF-16 кодовых единиц. Отсюда первый сюрприз:

string s = "😊";
Console.WriteLine(s.Length); // 2, не 1
Length считает не символы, а UTF-16 кодовые единицы. Эмодзи и многие Unicode-символы занимают две единицы — суррогатную пару. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view

⚙️ nameof теперь понимает несвязанные обобщения Удобство и гибкость метапрограммирования — теперь nameof работает для обобщений без аргументов. Благодаря новой поддержке можно получить имена обобщенных типов без указания параметров:
Console.WriteLine(nameof(List<>));  // Выведет "List"
📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

🗂 Работа и пет-проекты с одного ПК Работаете днём в корпоративном репо, вечером в личном на GitHub. Один ПК, но email и ключи подписи разные. Ручная смена настроек Git каждый раз бесит и приводит к косякам с коммитами. Условные includeIf решают всё Добавьте в ~/.gitconfig пару строк. Git сам подхватит нужный конфиг по пути к папке или remote URL. Для рабочих папок загрузит корпоративный email:
[includeIf "gitdir:~/work/"] path = .gitconfig-corp
Личные репозитории получат ваш домашний email автоматически:
[includeIf "hasconfig:remote.*.url:https://github.com/вашеимя/**"] path = .gitconfig-personal
Забудьте про git config --global user.email каждый раз. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

💥 Azure Functions: Linux Consumption уходит, на смену приходит Flex Microsoft постепенно закрывает старый Linux Consumption
💥 Azure Functions: Linux Consumption уходит, на смену приходит Flex Microsoft постепенно закрывает старый Linux Consumption Plan для Azure Functions. Его поддержка завершится 30 сентября 2028 года, а новые функции и версии языков для него уже не развиваются. Для новых serverless-приложений Microsoft рекомендует Flex Consumption. 🔘 Что меняется для .NET-разработчиков:
— Flex работает с .NET 8, 9 и 10 в isolated-модели; — функции масштабируются независимо друг от друга; — можно настраивать память инстанса; — появилась интеграция с VNet; — есть Always Ready-инстансы для снижения cold start; — деплой идёт через blob storage, а не старый zip-deploy.
📍 Переключить существующий Linux Consumption App на Flex «на месте» нельзя. Нужно создать новое Function App в Flex, перенести конфигурацию и задеплоить код. Для миграции Microsoft уже предлагает отдельный CLI:

az functionapp flex-migration start
Он создаёт Flex-приложение на основе существующего Linux Consumption App. 🔗 Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news

⚡️ C# 15 убирает флаг из вложенных циклов Раньше для выхода сразу из нескольких foreach часто приходилось заводить переменную:

bool found = false;

foreach (var warehouse in warehouses)
{
    foreach (var bin in warehouse.Bins)
    {
        if (bin.Sku == requestedSku)
        {
            found = true;
            break;
        }
    }

    if (found)
        break;
}
🤩 В C# 15 можно обозначить внешний цикл и выйти из него напрямую:

scan: foreach (var warehouse in warehouses)
{
    foreach (var bin in warehouse.Bins)
    {
        if (bin.Sku == requestedSku)
            break scan;
    }
}
Никаких found, дополнительного if и лишнего состояния. C# 15 сейчас доступен в .NET 11 Preview 7. 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

🗺 Группировка меток в картах MAUI Если на карте десятки или сотни меток, они сливаются в непроходимую кашу. В .NET MAUI 11 P
🗺 Группировка меток в картах MAUI Если на карте десятки или сотни меток, они сливаются в непроходимую кашу. В .NET MAUI 11 Preview 3 появилась кластеризация меток из коробки на Android и iOS/Mac Catalyst. 🤩 Как включить Одно свойство:

<maps:Map IsClusteringEnabled="True" />
Ближайшие метки автоматически группируются в кластер с числом внутри. При увеличении масштаба кластер раскрывается до отдельных пинов. 🤩 Разные группы кластеров Если нужно, чтобы кофейни кластеризовались отдельно от парков, используем ClusteringIdentifier на Pin:
map.Pins.Add(new Pin
{
    Label = "Pike Place Coffee",
    Location = new Location(47.6097, -122.3331),
    ClusteringIdentifier = "coffee"
});

map.Pins.Add(new Pin
{
    Label = "Occidental Square",
    Location = new Location(47.6064, -122.3325),
    ClusteringIdentifier = "parks"
});
Пины с одинаковым идентификатором группируются вместе. С разными — образуют независимые кластеры, даже если географически рядом. Пины без идентификатора попадают в общую группу по умолчанию. 🤩 Обработка нажатия на кластер При тапе на кластер срабатывает событие ClusterClicked:

map.ClusterClicked += async (sender, e) =>
{
    string names = string.Join("\n", e.Pins.Select(p => p.Label));
    await DisplayAlert(
        $"Кластер ({e.Pins.Count} меток)",
        names,
        "OK");

    // Отменить стандартное приближение к кластеру:
    // e.Handled = true;
};
🤩 В ClusterClickedEventArgs три поля:
• Pins — список пинов в кластере • Location — географический центр • Handled — если true, стандартное поведение (зум к кластеру) отменяется.
🤩 Платформенные детали На Android кластеризация работает через собственный алгоритм на основе сетки, пересчитывается при смене масштаба. Сторонние зависимости не нужны. На iOS и Mac Catalyst используется нативный MKClusterAnnotation из MapKit — анимации и поведение платформенные. Пример с кластеризацией уже есть в репозитории, страница Clustering в проекте MapDemo. ➡️ Блог разработчиков 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор

😎 Три строки C# — и ваш AI-агент уже готов к хостингу в Azure Microsoft показала интеграцию .NET с Foundry Hosted Agents: су
😎 Три строки C# — и ваш AI-агент уже готов к хостингу в Azure Microsoft показала интеграцию .NET с Foundry Hosted Agents: существующий агент на Microsoft Agent Framework можно превратить в hosted agent практически без изменения логики. 🤩 Достаточно добавить пакет:

dotnet add package Microsoft.Agents.AI.Foundry.Hosting --prerelease
🤩 И три строки:

var builder = AgentHost.CreateBuilder(args);

builder.Services.AddFoundryResponses(agent);

builder.RegisterProtocol(
    "responses",
    endpoints => endpoints.MapFoundryResponses());
🤩 Дальше:
azd provision
azd deploy
Foundry берёт на себя инфраструктуру, масштабирование, состояние сессий, identity, endpoint и observability. При этом сам AIAgent практически не меняется — вы просто добавляете вокруг него hosting-слой. ⁠🔗 Источник: From dotnet run to Foundry Hosted Agent in 3 lines of C# 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #async_news

🤩 EF Core: нормальный способ засевать базу В EF Core 9 появились UseSeeding() и UseAsyncSeeding(), а в актуальном EF Core 10 это уже рекомендуемый Microsoft способ для обычного заполнения базы начальными данными.

optionsBuilder
    .UseSeeding((context, _) =>
    {
        if (!context.Set<Role>().Any())
        {
            context.Set<Role>().AddRange(
                new Role { Name = "Admin" },
                new Role { Name = "User" });

            context.SaveChanges();
        }
    });
Плюс в том, что seed выполняется вместе с Migrate и dotnet ef database update, а EF защищает его механизмом блокировки миграций. 🤩 А HasData теперь лучше использовать для статических и детерминированных данных — например, фиксированного справочника. Для данных, зависящих от состояния БД, внешних API или требующих вычислений, Microsoft рекомендует UseSeeding. Если используете async-вариант, реализуйте и UseSeeding, и UseAsyncSeeding — EF tooling пока опирается на синхронный метод. 🔗 Источник 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view

👨‍💻 Ложная иммутабельность Часто новички в функциональном программировании думают, что сделали иммутабельный код. Берут список, вызывают ToList() или Select() и радуются новому списку. Но в C# это ловушка. Проблема в ссылочных типах. var copy = original.ToList() создаёт новый List, но все элементы внутри — те же самые объекты. Меняете свойство через copy, и оригинал тоже меняется. Правило трёх: 🤩 Records с init-only свойствами для value-like поведения 🤩 ImmutableList<T> из System.Collections.Immutable — настоящие неизменяемые коллекции 🤩 Struct только для маленьких типов 📍 Навигация: Вакансии • Задачи • Собесы 🐸Библиотека шарписта #sharp_view