ar
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

إظهار المزيد

📈 نظرة تحليلية على قناة تيليجرام Библиотека шарписта | 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_люминатор

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

👨‍💻 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

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

👨‍💻 Задача, которую переписывают снова и снова Каждый, кто работал с 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