Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @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 707 subscribers, ranking 5 962 in the Technologies & Applications category and 30 301 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 21 707 subscribers.
According to the latest data from 27 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -42 over the last 30 days and by 3 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 15.91%. Within the first 24 hours after publication, content typically collects 7.92% reactions from the total number of subscribers.
- Post reach: On average, each post receives 3 454 views. Within the first day, a publication typically gains 1 718 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 26.
- 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
По рекламе: @proglib_adv
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Thanks to the high frequency of updates (latest data received on 28 August, 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.
System.Text.Json получил больше контроля над именованием полей и обработкой значений по умолчанию. Алгоритм сжатия Zstandard переехал в System.IO.Compression — теперь он часть стандартной библиотеки, а не отдельный пакет. ZIP-чтение добавило валидацию CRC32. Regex теперь корректно обрабатывает все Unicode-последовательности переноса строки.
• Рантайм
Runtime async больше не требует явного opt-in через атрибут — функция стала стабильнее и готовится к основному потоку. JIT-компилятор улучшил оптимизацию switch-выражений, проверок границ массивов и операций приведения типов. Для WebAssembly добавлена поддержка WebCIL и улучшена отладка в браузере.
• SDK
dotnet run теперь принимает переменные окружения прямо из командной строки:
dotnet run -e MY_VAR=value
Solution-фильтры можно редактировать через CLI без открытия IDE. Файловые приложения теперь можно разбивать на несколько файлов. dotnet watch получил поддержку Aspire, восстановление после краша и улучшения для Windows Desktop.
• C#
Добавлена начальная поддержка типа union это размеченные объединения в духе F# или Rust. Пока preview, но направление понятное.
• ASP.NET Core
Поддержка Zstandard для сжатия ответов и распаковки запросов. Компонент Virtualize в Blazor теперь адаптируется к элементам с переменной высотой в рантайме. HTTP/3 начинает обрабатывать запросы раньше — меньше задержек на старте соединения.
• Entity Framework Core
ChangeTracker.GetEntriesForState() позволяет получать записи по состоянию без лишнего обнаружения изменений. DbContext теперь умеет удалять провайдеры и добавлять пулы фабрик. SQL-генератор стал убирать лишние JOIN-ы, а для SQL Server добавлены JSON API.
• Контейнеры
Образы .NET на mcr.microsoft.com теперь подписываются. Можно верифицировать их подлинность перед запуском.
• .NET MAUI
Maps API получил кластеризацию маркеров, стилизацию и расширенное API взаимодействия. LongPressGestureRecognizer теперь встроен в платформу. Добавлена поддержка Android 17 / API 37 в режиме preview.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_newsTools > Options > Environment > Windows > Floating Windows
Там есть выпадающий список «These floating windows are owned by the main window» с тремя вариантами:
• None — плавающие окна полностью независимы: у каждого своя кнопка в панели задач, они остаются на экране при • сворачивании IDE и не лезут поверх других приложений.
• Tool Windows — значение по умолчанию. Документы плавают свободно, а панели инструментов привязаны к IDE.
• Documents and Tool Windows — классическое поведение Visual Studio: всё подчиняется главному окну.
Двойной клик с зажатым Ctrl по заголовку любой панели мгновенно переключает её между плавающим и закреплённым состоянием.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewFsMcp это обёртка над официальным [Microsoft ModelContextProtocol .NET SDK](https://github.com/modelcontextprotocol/csharp-sdk). Библиотека добавляет поверх него computation expressions, типизированные обработчики инструментов и Result-based обработку ошибок.
Установка через NuGet:
dotnet add package FsMcp.Server
Дополнительные пакеты по необходимости:
dotnet add package FsMcp.Client # клиент dotnet add package FsMcp.Testing # тест-хелперы dotnet add package FsMcp.Server.Http # HTTP/SSE транспорт dotnet add package FsMcp.Sampling # вызов LLM из инструментовКак это работает Сервер описывается через
mcpServer { } — computation expression, внутри которого объявляются инструменты, ресурсы и промпты.
Инструмент принимает F#-запись как входные данные, JSON Schema генерируется автоматически через TypeShape:
type GreetArgs = { name: string; greeting: string option }
let server = mcpServer {
name "MyServer"
version "1.0.0"
tool (TypedTool.define<GreetArgs> "greet" "Greets a person" (fun args -> task {
let greeting = args.greeting |> Option.defaultValue "Hello"
return Ok [ Content.text $"{greeting}, {args.name}!" ]
}) |> unwrapResult)
useStdio
}
Server.run server |> fun t -> t.GetAwaiter().GetResult()
Поле greeting помечается как необязательное автоматически, потому что тип string option.
Пример с калькулятором:
type CalcArgs = { a: float; b: float }
let server = mcpServer {
name "Calculator"
version "1.0.0"
tool (TypedTool.define<CalcArgs> "add" "Add two numbers" (fun args -> task {
return Ok [ Content.text $"{args.a + args.b}" ]
}) |> unwrapResult)
tool (TypedTool.define<CalcArgs> "divide" "Divide a by b" (fun args -> task {
if args.b = 0.0 then return Error (TransportError "Division by zero")
else return Ok [ Content.text $"{args.a / args.b}" ]
}) |> unwrapResult)
useStdio
}
Ошибки возвращаются через Result<'T, McpError> без исключений на ожидаемых путях.
HTTP-транспорт
Если нужен не stdio, а HTTP/SSE:
open FsMcp.Server.Http
HttpServer.run server (Some "/mcp") "http://localhost:3001"
|> fun t -> t.GetAwaiter().GetResult()
Тестирование
FsMcp.Testing позволяет вызывать инструменты напрямую, без сетевого соединения и запуска процессов:
open FsMcp.Testing
let result =
TestServer.callTool serverConfig "add"
(Map.ofList ["a", jsonEl 10; "b", jsonEl 20])
|> Async.AwaitTask |> Async.RunSynchronously
result |> Expect.mcpHasTextContent "30" "addition works"
Что ещё есть в библиотеке
FsMcp покрывает не только базовый сценарий. Среди возможностей: стриминговые инструменты через IAsyncEnumerable<Content>, уведомления о прогрессе, валидационный middleware, трассировка через OpenTelemetry, горячая замена инструментов (DynamicServer.addTool) и интеграция с FsToolkit.ErrorHandling через пакет FsMcp.TaskApi.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewSKILL.md с инструкциями, скрипты и референсные документы:
skills/
└── onboarding-guide/
├── SKILL.md
├── scripts/
│ └── check-provisioning.py
└── references/
└── onboarding-checklist.md
В SKILL.md описываем метаданные и шаги для агента. Провайдер поднимается одной строкой:
var skillsProvider = new AgentSkillsProvider(
Path.Combine(AppContext.BaseDirectory, "skills"),
SubprocessScriptRunner.RunAsync);
2️⃣ Классовый скилл из NuGet
Команда HR-систем публикует Contoso.Skills.HrEnrollment. Внутри — класс, унаследованный от AgentClassSkill<T>. Ресурсы помечаются атрибутом [AgentSkillResource], скрипты — [AgentSkillScript]. Рефлексия сама находит всё нужное:
public sealed class BenefitsEnrollmentSkill : AgentClassSkill<BenefitsEnrollmentSkill>
{
public override AgentSkillFrontmatter Frontmatter { get; } = new(
"benefits-enrollment",
"Enroll an employee in health, dental, or vision plans.");
[AgentSkillResource("available-plans")]
public string AvailablePlans => "...список планов...";
[AgentSkillScript("enroll")]
private static string Enroll(string employeeId, string planCode) { ... }
}
3️⃣ Инлайн-скилл
Нужный навык ещё не вышел, а ждать нельзя. Пишем прямо в коде через AgentInlineSkill:
var timeOffSkill = new AgentInlineSkill(
name: "time-off-balance",
description: "Calculate remaining vacation and sick days.",
instructions: "...")
.AddScript("calculate-balance", (string employeeId, string leaveType) =>
{
int remaining = HrDatabase.GetAnnualAllowance(employeeId, leaveType)
- HrDatabase.GetDaysUsed(employeeId, leaveType);
return JsonSerializer.Serialize(new { employeeId, leaveType, remaining });
});
Когда NuGet-пакет выйдет, то просто убираем строку из билдера. Агент ничего не заметит.
Собираем всё вместе
AgentSkillsProviderBuilder объединяет все три типа:
var skillsProvider = new AgentSkillsProviderBuilder()
.UseFileSkill(Path.Combine(AppContext.BaseDirectory, "skills"))
.UseSkill(new BenefitsEnrollmentSkill())
.UseSkill(timeOffSkill)
.UseFileScriptRunner(SubprocessScriptRunner.RunAsync)
.UseScriptApproval(true) // подтверждение перед запуском скриптов
.Build();
UseScriptApproval(true) добавляет человека в цикл: агент приостанавливается перед каждым запуском скрипта и ждёт одобрения. Полезно там, где скрипты имеют реальные последствия — записывают данные, обращаются к продакшн-инфраструктуре.
Подход удобен тем, что каждый шаг независим. Не нужно согласовывать форматы между командами или держать всё в одном репозитории. Файловые скиллы хорошо подходят для контента, который часто меняется. Классовые — для переиспользуемой логики, которую удобно поставлять как пакет. Инлайновые — для временных заглушек и случаев, когда скилл нужно генерировать динамически из данных.
➡️ Источник | Документация | Примеры на GitHub
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор/transfer?amount=10000&to=hacker. Браузер добросовестно прикладывает куки сессии. Сервер видит валидный запрос. Деньги ушли.
Как включить защиту:
1. Регистрация сервиса:
builder.Services.AddAntiforgery();2. Защита конкретного эндпоинта:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Submit(FormModel model)
{
// обработка только "своих" запросов
}
3. Глобальная защита через фильтр:
builder.Services.AddControllersWithViews(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
Minimal API — вручную:
app.MapPost("/submit", ([FromForm] IFormCollection form,
IAntiforgery antiforgery, HttpContext ctx) =>
{
antiforgery.ValidateRequestAsync(ctx);
// ...
});
CSRF-защита критична для любых форм, меняющих состояние: оплата, смена пароля, удаление данных.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewPython и современных фреймворков. Мы не будем учить «общаться» с нейросетью, мы будем строить из неё надёжный инструмент.
✅ Что вы получите:
— понимание того, как управлять логикой агента на уровне кода;
— навыки работы с LangChain и библиотеками оркестрации;
— готовые паттерны для обработки ошибок и галлюцинаций;
— опыт создания систем, которые реально экономят время.
Есть пара мест со скидкой до завтра, решайтесь 👈🏻fixed.
Сборщик мусора не просто удаляет объекты, он их перемещает. Это часть компактизации кучи. В управляемом коде это незаметно, потому что среда сама отслеживает ссылки. Но как только вы получаете сырой указатель в unsafe-блоке, GC об этом не знает. Он спокойно переместит объект, а ваш указатель останется висеть в воздухе.
Результат: невоспроизводимые падения, тихая порча данных или обращение к чужой памяти.
Как работает fixed
Оператор fixed говорит сборщику: «не трогай этот объект, пока я с ним работаю». Объект временно закрепляется в памяти, и указатель остаётся валидным на протяжении всего блока:
unsafe
{
fixed (int* ptr = &array[0])
{
// ptr гарантированно указывает туда, куда нужно
for (int i = 0; i < array.Length; i++)
{
*(ptr + i) *= 2;
}
}
// После выхода из блока GC снова может перемещать объект
}
Всё, что происходит внутри блока fixed, защищено. Как только вы выходите за его пределы, объект снова становится целью для GC.
Когда это нужно
1. interop с нативными библиотеками. Если вы передаёте указатель в C или C++ код через P/Invoke, объект должен быть закреплён на время вызова. Иначе GC может переместить его прямо во время работы нативной функции:
[DllImport("native.dll")]
static extern void ProcessBuffer(int* buffer, int length);
unsafe
{
fixed (int* ptr = data)
{
ProcessBuffer(ptr, data.Length);
}
}
2. Высокопроизводительная обработка данных. Когда LINQ и foreach дают слишком много накладных расходов, прямая работа с памятью через указатели ускоряет обработку. Это актуально для парсинга бинарных форматов, работы с изображениями, аудио, сетевыми буферами.
3. Небезопасные операции cо Span<T>. Если вы получаете указатель из Span, backing-объект тоже нужно закрепить.
Практическое правило простое: блок fixed должен содержать только тот код, которому реально нужен указатель. Никакой лишней логики внутри.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминаторvirtual и private должны просто работать вместе. Один говорит «этот метод можно переопределить», другой говорит «этот метод виден только внутри класса».
Подсказка: что переопределение метода подразумевает с точки зрения доступности.
Ответ: в нашем канале по подготовке к собесу
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#dotnet_challengefind . -type f -print0 | while IFS= read -r -d '' file; do
claude \
--dangerously-skip-permissions \
--print "Find a vulnerability. hint: look at $file.
Write the most serious one to /out/report.txt."
done
Идея в том, чтобы прогнать Claude Code по каждому файлу и собрать отчёт.
Адаптация для C# на Windows:
Get-ChildItem -Path . -Recurse -Filter "*.cs" | ForEach-Object {
$file = $_.FullName
& claude `
--dangerously-skip-permissions `
--print "Find a vulnerability. hint: look at $file
Write the most serious one to report.txt"
}
На выходе список строк с предупреждениями. Claude описывает конкретный сценарий атаки с шагами, объясняет почему это работает и даёт рекомендации по исправлению.
Классический аудит стоит десятки тысяч евро и занимает месяцы. Этот скрипт запускается за минуту и даёт первый результат за пару часов.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewVolatile решает проблему видимости, то Interlocked решает проблему атомарности. Операции реализованы на уровне процессора и выполняются как неделимые единицы — никакой другой поток не может вмешаться в середину
Самый частый сценарий это счётчик, который обновляют несколько потоков:
private int _counter;
public void Increment()
{
Interlocked.Increment(ref _counter);
}
Без Interlocked операция _counter++ на самом деле три шага: прочитать, прибавить, записать. Два потока могут выполнить их одновременно и затереть результат друг друга. Interlocked.Increment делает всё это за один неделимый шаг.
Lock-free генератор ID
Interlocked подходит для генерации уникальных идентификаторов без блокировок:
public int GetNextId()
{
return Interlocked.Increment(ref _id);
}
Каждый вызов гарантированно вернёт уникальное значение, даже если тысячи потоков вызывают метод одновременно.
CompareExchange: условное обновление
Самая мощная операция в арсенале Interlocked:
if (Interlocked.CompareExchange(ref _state, 1, 0) == 0)
{
// Успешно перешли из состояния 0 в 1
}
Логика простая: если текущее значение равно 0, заменить на 1 и вернуть старое значение. Если кто-то уже изменил _state, операция ничего не сделает. Это паттерн, на котором строятся lock-free кэши, планировщики и конкурентные очереди.
Volatile и Interlocked — не одно и то же
Их можно перепутать, но они решают разные задачи.
Volatile гарантирует, что поток видит актуальное значение переменной. Interlocked гарантирует, что сама операция выполняется безопасно, без вмешательства других потоков.
В реальных системах нередко нужны оба. Volatile чтобы читать свежие данные, Interlocked чтобы безопасно их менять.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewdd - День с нулем ddd - Короткий день недели dddd - Полный день недели MM - Месяц с нулем MMM - Короткий месяц MMMM - Полный месяц yy - Год две цифры yyyy - Год четыре цифры HH - Часы 24 hh - Часы 12 mm - Минуты ss - Секунды fff - Миллисекунды tt - AM/PM zzz - Часовой поясПримеры в кодe:
var dt = new DateTime(2026, 4, 7, 17, 34, 12);
dt.ToString("yyyy-MM-dd") // 2026-04-07
dt.ToString("dd.MM.yyyy") // 07.04.2026
dt.ToString("HH:mm:ss") // 17:34:12
dt.ToString("dddd, dd MMMM") // вторник, 07 апреля
Для разбора строки используйте ParseExact или TryParseExact. Они требуют точного совпадения, убирая ошибки:
var text = "2026-04-07 17:34:12";
var parsed = DateTime.ParseExact(text, "yyyy-MM-dd HH:mm:ss", null);
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view