Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для 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) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
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 s = "😊";
Console.WriteLine(s.Length); // 2, не 1
Length считает не символы, а UTF-16 кодовые единицы. Эмодзи и многие Unicode-символы занимают две единицы — суррогатную пару.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view.NET-сервисов — весело, но энтерпрайзу нужна предсказуемость. Как интегрировать ИИ-агентов в корпоративную инфраструктуру, контролировать затраты и не нарушить 152-ФЗ?
В обновлённой программе фокус смещён на жёсткий инжиниринг и вывод мультиагентных систем в прод. Вы научитесь строить ReAct-циклы, работать с оркестраторами вроде LangGraph, внедрять продвинутый RAG, протоколы MCP и AgentOps. Все ключевые навыки в одном месте: измеримость систем, интеграция с легаси, human-in-the-loop и развёртывание LLM-решений в закрытых контурах.
Почему нельзя откладывать:
— масштабная акция «3 курса по цене 1» сгорит уже завтра;
— промокод Agent на скидку 10 000 рублей действует последние часы;
— сразу после оформления открываются материалы для подготовки — начать учиться можно прямо сейчас.
Забронировать место на курсе и забрать бонусы до 28 февраляstatic List<Order> _orders = new();
List<T> не потокобезопасен — параллельная запись приведёт к повреждению данных или исключению.
Лучше:
static ConcurrentBag<Order> _orders = new();Но ещё лучше избавиться от глобального изменяемого состояния полностью. Статические поля — это скрытые зависимости, которые делают код менее тестируемым и непредсказуемым под нагрузкой. Вопросы для ревью такого кода: — Защищено ли общее состояние? — Есть ли состояния гонки? — Безопасен ли код при параллельном выполнении? — Действительно ли асинхронные методы потокобезопасны? — Нет ли скрытого изменяемого состояния в статических полях? — Используются ли потокобезопасные коллекции там, где это нужно? 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
@inject AppDbContext сломается в браузере.
Решение — общий интерфейс с двумя реализациями: серверной и клиентской. DI сам подставит нужную.
Как выбирать:
— небольшая внутренняя аудитория, нужна скорость разработки → Server
— публичный SaaS, много пользователей, важна стоимость хостинга → WebAssembly
— публичное приложение, важен SEO и первый paint, но нужна SPA-производительность → Auto
— сложный продукт с разными модулями → комбинируйте режимы под каждый раздел
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view@Test покрой тестами мою бизнес-логику @Test класс OrderService, целевое покрытие 80% @Test напиши тесты для моих текущих изменений в git @Test используй xUnit и FluentAssertionsОбласть охвата: метод, класс, файл, проект, весь solution или текущий git diff — на ваш выбор. ➡️ Блог Microsoft 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #async_news
AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Сделать простую цепочку на C
легко, а вот интегрировать агентов в корпоративный контур, чтобы они не галлюцинировали и не сливали бюджет в проде — задача со звёздочкой.
В программе:
— интеграции по стандарту MCP и мультиагентные паттерны;
— оркестрация в LangGraph: human-in-the-loop и runbook для отказов;
— продвинутый RAG для промышленной эксплуатации и парсинг сложных документов;
— контроль экономики агентов: маршрутизация и кеширование;
— развёртывание локальных опенсорс-моделей в закрытых контурах по 152-ФЗ.
В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).
Доступ к материалам для предварительной подготовки откроется сразу после оплаты.
По промокоду Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля!
👉 Присоединиться к четвёртому потоку и вывести агентов в прод[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[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_viewdotnet add package RecurPixel.Notify.SdkЭто чистая библиотека, никакого SaaS, никаких внешних серверов. Вы приносите свои API-ключи, сами решаете, куда логировать доставку — через OnDelivery() пишете в свою БД. Хотите поменять Twilio на Vonage — меняете конфиг, код не трогаете. Провайдеров уже больше 30. Большинство покрыто юнит-тестами, часть — интеграционными. ➡️ Репозиторий 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
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
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
