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 872 名订阅者,在 技术与应用 类别中位列第 6 212,并在 俄罗斯 地区排名第 30 851

📊 受众指标与增长动态

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

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

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

📝 描述与内容策略

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

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

21 872
订阅者
-424 小时
-167
-8730
帖子存档
🌍 Сравнение строк и культура Когда вы сравниваете строки в C#, результат зависит не только от содержимого, но и от того, как вы сравниваете. И здесь кроется целый класс багов, которые воспроизводятся только на машинах с определёнными региональными настройками. Два режима сравнения: Ordinal — побайтовое сравнение Unicode-значений. Быстрое, предсказуемое, не зависит от культуры. CurrentCulture — сравнение по правилам текущей локали операционной системы. Медленнее, результат может отличаться на разных машинах. Пример с немецким языком:
string a = "straße";  // немецкое "улица"
string b = "strasse"; // то же слово, другое написание

a.Equals(b, StringComparison.CurrentCultureIgnoreCase); // true на de-DE
a.Equals(b, StringComparison.CurrentCultureIgnoreCase); // false на en-US
a.Equals(b, StringComparison.OrdinalIgnoreCase);        // false везде
Один и тот же код даёт разные результаты в зависимости от того, где запущен. На машине разработчика работает, на продакшен-сервере — нет. Турецкая проблема:
// В турецкой локали (tr-TR):
"I".ToLower() == "ı"  // не "i", а "ı" (без точки)
"i".ToUpper() == "İ"  // не "I", а "İ" (с точкой)

// Поэтому:
string input = "FILE";
input.ToLower() == "file" // false на турецкой машине!
Именно из-за этого Microsoft SQL Server годами имел баги в коде, который работал везде, кроме турецких инсталляций. Анализатор CA1307 в .NET предупреждает о вызовах сравнения без явного указания StringComparison. Включите его — он поймает большинство таких мест автоматически. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #il_люминатор

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

Последний шанс: 3 курса по цене 1 и запуск AI-агентов в продакшн Дёргать API OpenAI из .NET-сервисов — весело, но энтерпрайзу нужна предсказуемость. Как интегрировать ИИ-агентов в корпоративную инфраструктуру, контролировать затраты и не нарушить 152-ФЗ? В обновлённой программе фокус смещён на жёсткий инжиниринг и вывод мультиагентных систем в прод. Вы научитесь строить ReAct-циклы, работать с оркестраторами вроде LangGraph, внедрять продвинутый RAG, протоколы MCP и AgentOps. Все ключевые навыки в одном месте: измеримость систем, интеграция с легаси, human-in-the-loop и развёртывание LLM-решений в закрытых контурах. Почему нельзя откладывать: — масштабная акция «3 курса по цене 1» сгорит уже завтра; — промокод Agent на скидку 10 000 рублей действует последние часы; — сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас. Забронировать место на курсе и забрать бонусы до 28 февраля

❓ Что выведет код Сделали сниппет кода на манер JavaScript, складываем число и строку. В C#, в отличие от JS, это операция пр
Что выведет код Сделали сниппет кода на манер JavaScript, складываем число и строку. В C#, в отличие от JS, это операция предсказуемая и можно догадаться о результате. ➡️ Проверьте себя не запуская код 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #dotnet_challenge

⚡️ Корректность в условиях конкурентности Современный код на .NET редко выполняется изолированно. Тревожный сигнал: static Li
⚡️ Корректность в условиях конкурентности Современный код на .NET редко выполняется изолированно. Тревожный сигнал:
static List<Order> _orders = new();
List<T> не потокобезопасен — параллельная запись приведёт к повреждению данных или исключению. Лучше:
static ConcurrentBag<Order> _orders = new();
Но ещё лучше избавиться от глобального изменяемого состояния полностью. Статические поля — это скрытые зависимости, которые делают код менее тестируемым и непредсказуемым под нагрузкой. Вопросы для ревью такого кода: — Защищено ли общее состояние? — Есть ли состояния гонки? — Безопасен ли код при параллельном выполнении? — Действительно ли асинхронные методы потокобезопасны? — Нет ли скрытого изменяемого состояния в статических полях? — Используются ли потокобезопасные коллекции там, где это нужно? 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

🔍 PVS-Studio 7.41 Вышел новый релиз статического анализатора PVS-Studio. Разбираем, что изменилось. Улучшения для Unreal Eng
🔍 PVS-Studio 7.41 Вышел новый релиз статического анализатора PVS-Studio. Разбираем, что изменилось. Улучшения для Unreal Engine Исправлены ошибки в диагностическом правиле V557 при работе с контейнерами движка, а также проблема с парсингом спецификатора final в виртуальных функциях. Taint-анализ в C# Добавлена поддержка JSON-аннотаций для async-функций. Теперь можно передавать анализатору дополнительный контекст через JSON-файл для асинхронного кода. Утилита pvs-fp-cleaner Новый инструмент для автоматического удаления устаревших маркеров ложных срабатываний из кодовой базы. Раньше это приходилось делать вручную, просматривая весь код. Плагин IntelliJ IDEA Добавлен экспорт отчётов в CSV, отображение относительных путей, исправлено торможение при открытии документации. Новое правило для C# V3230 — бессмысленное сравнение с typeof(Nullable) ➡️ Release Notes 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #async_news

⚡️ .NET 10 Blazor: как выбрать render mode для реального проекта Blazor даёт три модели выполнения. Это не стилистические раз
⚡️ .NET 10 Blazor: как выбрать render mode для реального проекта Blazor даёт три модели выполнения. Это не стилистические различия — они определяют где живёт память, как работает сеть и во сколько обходится масштабирование. Interactive Server C# выполняется на сервере, браузер — тонкий клиент. Между ними — постоянный WebSocket: каждое UI-событие летит на сервер, обратно возвращается только diff DOM. Каждая открытая вкладка создаёт circuit в памяти сервера. 1000 пользователей — ~300 МБ только на состояние, 20 000 — уже серьёзная инфраструктура. Зато можно инжектить DbContext прямо в компонент, не нужен API-слой, скорость разработки максимальная. Подходит для внутренних инструментов с небольшой аудиторией. Interactive WebAssembly Браузер скачивает .NET runtime и сборки приложения, C# выполняется локально. UI-события не уходят в сеть — отклик мгновенный. Сервер становится stateless: только API и статика. Первая загрузка тяжелее — от 2 до 10+ МБ в зависимости от сборок. И главное правило: никаких секретов в WASM, IL декомпилируется. Вся авторизация и бизнес-логика — только за API. Хорошо масштабируется, дёшево хостится через CDN. Interactive Auto Гибридный режим: первый визит работает как Server — мгновенный рендер без ожидания загрузки WASM. Параллельно браузер скачивает рантайм, и при следующем визите компонент уже выполняется на клиенте. Сложность в том, что один и тот же компонент должен уметь работать в обоих контекстах. Прямой @inject AppDbContext сломается в браузере. Решение — общий интерфейс с двумя реализациями: серверной и клиентской. DI сам подставит нужную. Как выбирать: — небольшая внутренняя аудитория, нужна скорость разработки → Server — публичный SaaS, много пользователей, важна стоимость хостинга → WebAssembly — публичное приложение, важен SEO и первый paint, но нужна SPA-производительность → Auto — сложный продукт с разными модулями → комбинируйте режимы под каждый раздел 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

🤖 GitHub Copilot Testing для .NET теперь в Visual Studio 2026 Microsoft официально выпустила инструмент для автоматической г
🤖 GitHub Copilot Testing для .NET теперь в Visual Studio 2026 Microsoft официально выпустила инструмент для автоматической генерации юнит-тестов прямо в IDE. Больше не нужно писать тесты с нуля вручную. Вы пишете в Copilot Chat @Test и описываете, что хотите протестировать. И Copilot сам: — генерирует юнит-тесты — собирает и запускает их — находит упавшие тесты и пытается их починить — повторяет, пока всё не стабилизируется — показывает итоговый отчёт: покрытие до/после, что прошло, что упало Что можно просить:
@Test покрой тестами мою бизнес-логику
@Test класс OrderService, целевое покрытие 80%
@Test напиши тесты для моих текущих изменений в git
@Test используй xUnit и FluentAssertions
Область охвата: метод, класс, файл, проект, весь solution или текущий git diff — на ваш выбор. ➡️ Блог Microsoft 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #async_news

✏️ Оставить след в опенсорсе goodfirstissue.dev собирает задачи с пометкой good first issue из популярных проектов — это реал
✏️ Оставить след в опенсорсе goodfirstissue.dev собирает задачи с пометкой good first issue из популярных проектов — это реальные баги и небольшие фичи, которые мейнтейнеры специально отмечают как подходящие для новичков в проекте. Контрибьют в open-source — это не только строчка в резюме. Это код-ревью от людей, которые написали библиотеки, которыми ты пользуешься, и понимание того, как устроены проекты изнутри. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

За год мы провели три потока курса по ИИ-агентам, а теперь запускаем масштабное обновление! В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Сделать простую цепочку на C легко, а вот интегрировать агентов в корпоративный контур, чтобы они не галлюцинировали и не сливали бюджет в проде — задача со звёздочкой. В программе: — интеграции по стандарту MCP и мультиагентные паттерны; — оркестрация в LangGraph: human-in-the-loop и runbook для отказов; — продвинутый RAG для промышленной эксплуатации и парсинг сложных документов; — контроль экономики агентов: маршрутизация и кеширование; — развёртывание локальных опенсорс-моделей в закрытых контурах по 152-ФЗ. В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок). Доступ к материалам для предварительной подготовки откроется сразу после оплаты. По промокоду Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля! 👉 Присоединиться к четвёртому потоку и вывести агентов в прод

💡 Подборка вакансий для шарпистов Senior разработчик C# — удалёнка Middle/Middle+ C#/.NET Developer — тоже удалёнка .NET-разработчик — от 250 000 ₽ и снова удалёнка ➡️ Еще больше топовых вакансий — в нашем канале C# Jobs 🐸 Библиотека шарписта

🔗 Идём в нативный мир Иногда .NET-коду нужно выйти за пределы управляемого мира и напрямую поговорить с операционной системой, нативными библиотеками или COM-компонентами. Для этого существует Native Interop — набор механизмов, встроённых прямо в рантайм. Зачем это вообще нужно Три основных сценария: ОС предоставляет огромное количество API, которых нет в BCL, например, доступ к оборудованию, системные вызовы; интеграция с кодом на C/C++ или Java через JNI; и автоматизация Windows-приложений вроде Office через COM. Platform Invoke — главный инструмент Platform Invoke позволяет вызывать функции из нативных библиотек .dll / .so / .dylib. В .NET 7+ вместо старого [DllImport] рекомендуется использовать [LibraryImport]:
[LibraryImport("nativelib", EntryPoint = "to_lower",
    StringMarshalling = StringMarshalling.Utf16)]
internal static partial string ToLower(string str);
LibraryImport запускает source-генератор, который формирует весь код маршалинга на этапе компиляции, а не в рантайме — это открывает возможность для Native AOT и инлайнинга P/Invoke-вызовов. Маршалинг типов Маршалинг необходим потому, что типы в управляемом и неуправляемом коде различаются. Например, в .NET строка одна, а в нативном коде их может быть множество: UTF-16, ANSI, UTF-8, null-terminated, ASCII и так далее. Для управления маршалингом используются атрибуты [MarshalAs] и [StructLayout]. Для нативных структур нужно воспроизвести их в управляемом коде с точным совпадением порядка и размеров полей. Blittable-типы — типы с одинаковым битовым представлением в managed и native коде. Они не требуют конвертации и просто закрепляются в памяти — используйте их везде, где возможно. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

👀 YAGNI в реальной жизни YAGNI (You Aren't Gonna Need It) — принцип из разработки: не делайте то, что может пригодиться когд
👀 YAGNI в реальной жизни YAGNI (You Aren't Gonna Need It) — принцип из разработки: не делайте то, что может пригодиться когда-нибудь. Работает не только в коде. Не покупайте инструмент на всякий случай. Нужна дрель — возьмите в аренду или одолжите. Купите перфоратор — будет пылиться 10 лет. Не записывайтесь на 5 курсов параллельно, «пройду потом» может не случится — вдруг смените род деятельности, к примеру. Закончите один, потом решайте нужен ли следующий. 💬 Бывало такое, что нарушали YAGNI в реальной жизни? Или может наоборот трезво оценили ситуацию и не купились? Интересно будет почитать в комментах 👇 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #entry_point

👨‍💻 TDD в больших проектах Все слышали мантру: «пиши тесты сначала, код потом». Звучит разумно. Но когда проект уже большой
👨‍💻 TDD в больших проектах Все слышали мантру: «пиши тесты сначала, код потом». Звучит разумно. Но когда проект уже большой, то TDD может занять куда больше сил. Казалось бы, вот простая задача: добавить поле DeliveryComment к заказу. Бизнес просит, задача на час. Давайте по TDD — сначала тест:
[Fact]
public void CreateOrder_WithDeliveryComment_ShouldPersistComment()
{
    var service = new OrderService(...); // 6 зависимостей
    var request = new OrderRequest { DeliveryComment = "Позвонить за 10 минут" };
    var result = service.CreateOrder(request);
    Assert.Equal("Позвонить за 10 минут", result.DeliveryComment);
}
Чтобы написать этот тест, вам нужно: поднять моки для всех зависимостей OrderService, разобраться, как устроен OrderRequest, понять, где вообще маппинг в entity. А сама фича — это три строки кода:
// OrderRequest.cs
public string? DeliveryComment { get; set; }

// OrderEntity.cs
public string? DeliveryComment { get; set; }

// OrderService.cs
entity.DeliveryComment = request.DeliveryComment;
Три строки. Тест к ним — тридцать. И это тест, который проверяет, что присвоение работает. То есть тест на то, что C# умеет присваивать строки. Для сложной бизнес-логики с граничными случаями он работает отлично. Но когда вы добавляете поле к DTO или прокидываете значение через три слоя — писать тест до кода означает тратить время команды на церемонию ради церемонии. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

👨‍💻 Задача, которую переписывают снова и снова Каждый, кто работал с ASP.NET Core хоть на одном серьёзном проекте, знает эт
👨‍💻 Задача, которую переписывают снова и снова Каждый, кто работал с ASP.NET Core хоть на одном серьёзном проекте, знает этот момент: надо отправить письмо, SMS или пуш — и начинается. Подключаете SendGrid, пишете обёртку, потом прилетает задача «добавь ещё Slack», потом WhatsApp, потом Teams. Каждый раз — новый провайдер, новый SDK, новый слой абстракции, который придумывается на ходу. С такой болью была написана библиотека RecurPixel.Notify, которая закрывает эту проблему. Идея простая: один интерфейс INotifyService — любой канал. Email, SMS, Push, WhatsApp, Slack, Discord, Teams, Telegram, Facebook, Viber и даже In-App нотификации. Всё через одну точку входа, всё через стандартный DI. Подключается в одну строку:
dotnet add package RecurPixel.Notify.Sdk
Это чистая библиотека, никакого SaaS, никаких внешних серверов. Вы приносите свои API-ключи, сами решаете, куда логировать доставку — через OnDelivery() пишете в свою БД. Хотите поменять Twilio на Vonage — меняете конфиг, код не трогаете. Провайдеров уже больше 30. Большинство покрыто юнит-тестами, часть — интеграционными. ➡️ Репозиторий 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

🧑‍💻 Юнит-тестирование F# с xUnit Рассмотрим, как настроить юнит-тестирование F#-библиотеки с помощью xUnit и dotnet test. Для чистоты разделим библиотеку и тесты на два отдельных проекта внутри одного solution:
/unit-testing-with-fsharp unit-testing-with-fsharp.sln /MathService ← бизнес-логика /MathService.Tests ← тесты
Создаём скелет проекта:
mkdir unit-testing-with-fsharp && cd unit-testing-with-fsharp
dotnet new sln

mkdir MathService && cd MathService
dotnet new classlib -lang "F#"
cd ..
dotnet sln add ./MathService/MathService.fsproj
Наша тестируемая функция:
module MyMath =
    let private isOdd x = x % 2 <> 0
    let private square x = x * x

    let squaresOfOdds xs =
        xs
        |> Seq.filter isOdd
        |> Seq.map square
Цель функции — принять последовательность целых чисел и вернуть квадраты всех нечётных элементов. Настраиваем тестовый проект:
mkdir MathService.Tests && cd MathService.Tests
dotnet new xunit -lang "F#"
dotnet reference add ../MathService/MathService.fsproj
cd ..
dotnet sln add ./MathService.Tests/MathService.Tests.fsproj
Команда dotnet reference add доступна в .NET 10+. На более ранних SDK используйте dotnet add reference. Тесты:
module MathService.Tests

open Xunit

[<Fact>]
let ``Sequence of Evens returns empty collection`` () =
    let expected = Seq.empty<int>
    let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
    Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)

[<Fact>]
let ``Sequences of Ones and Evens returns Ones`` () =
    let expected = [1; 1; 1; 1]
    let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
    Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)

[<Fact>]
let ``SquaresOfOdds works`` () =
    let expected = [1; 9; 25; 49; 81]
    let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
    Assert.Equal(expected, actual)
➡️ Оригинальная документация 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #sharp_view

👨‍💻 Блокнот теперь с картинками Российские пользователи Notion, которых в 2022 году попросили на выход, могут выдохнуть — з
👨‍💻 Блокнот теперь с картинками Российские пользователи Notion, которых в 2022 году попросили на выход, могут выдохнуть — замена найдена. Microsoft методично превращает Блокнот во всё то, за что люди платили подписку: таблицы уже есть, ИИ уже есть, Markdown уже есть, картинки вот-вот завезут. Поддержка изображений тестируется во внутренних сборках, и по результатам тестов функция практически не влияет на производительность. 📍 Навигация: ВакансииЗадачиСобесы 🐸 Библиотека шарписта #async_news