Библиотека шарписта | 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 — головні інсайти року 
