Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/b60af5a4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Ko'proq ko'rsatish📈 Telegram kanali Библиотека шарписта | C#, F#, .NET, ASP.NET analitikasi
Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 21 872 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 6 212-o'rinni va Rossiya mintaqasida 30 851-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 21 872 obunachiga ega bo‘ldi.
10 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -87 ga, so‘nggi 24 soatda esa -4 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 12.06% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 7.04% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 2 638 marta ko‘riladi; birinchi sutkada odatda 1 540 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 8 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent .net, шарписта, навигация, await, string kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Все самое полезное для C#-разработчика в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/b60af5a4
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 11 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
public class DbContextMigrationsHealthCheck(DbContext dbContext) : IHealthCheck
{
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
try
{
var applied = await dbContext.Database
.GetAppliedMigrationsAsync(cancellationToken: cancellationToken);
var pending = await dbContext.Database
.GetPendingMigrationsAsync(cancellationToken);
if (pending.Any())
{
return HealthCheckResult.Degraded(
"Есть неприменённые миграции.",
data: new Dictionary<string, object>
{
{ "PendingMigrations", pending },
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
return HealthCheckResult.Healthy(
data: new Dictionary<string, object>
{
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
catch (Exception ex)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: ex);
}
}
}
Идея не ограничивается EF Core. Любая зависимость, которая доступна, но ещё не готова к работе:
• CMS — нужно прогреть кэш перед началом работы
• Биллинг — зависит от загрузки актуальных правил ценообразования
• Search API — ждёт готовности текущей версии индекса
Сервис здоров не тогда, когда открывает SQL-коннекшн. Сервис здоров, когда готов выполнять ту работу, для которой задеплоен.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминаторJsonSerializerOptions — GetTypeInfo<T>() и TryGetTypeInfo<T>(). Раньше, чтобы получить JsonTypeInfo<T>, приходилось вручную кастовать результат из не-дженерикового GetTypeInfo(Type).
// Раньше
JsonTypeInfo<MyType> info = (JsonTypeInfo<MyType>)options.GetTypeInfo(typeof(MyType));
// Теперь
JsonTypeInfo<MyType> info = options.GetTypeInfo<MyType>();
Если тип может быть не зарегистрирован — есть вариант с TryGetTypeInfo<T>(), который не бросает исключение, а возвращает bool.
if (options.TryGetTypeInfo<MyType>(out JsonTypeInfo<MyType>? typeInfo))
{
// typeInfo готов к работе
}
Изменение небольшое, но устраняет одну из тех мелких раздражающих вещей, с которыми сталкиваешься в реальных проектах.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewusing System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Console.CursorVisible = false;
print('H', ConsoleColor.Red);
print('e', ConsoleColor.Yellow);
print('l', ConsoleColor.Magenta);
print('l', ConsoleColor.Green);
print('o', ConsoleColor.Blue);
print(',', ConsoleColor.Red);
print(' ', ConsoleColor.Red);
print('w', ConsoleColor.Magenta);
print('o', ConsoleColor.Cyan);
print('r', ConsoleColor.Yellow);
print('l', ConsoleColor.Green);
print('d', ConsoleColor.Blue);
print('!', ConsoleColor.Red);
}
static void print(char letter, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.Write(letter);
}
}
Возьмите минутку перерыва и запустите.
💬 А у вас есть любимый бессмысленный кусок кода
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#entry_point"PerEndpoint": {
"Dashboard:Metrics": { "AbsoluteTtlSeconds": 300 },
"Employees:GetAll": { "AbsoluteTtlSeconds": 300, "SlidingTtlSeconds": 120 }
}
• MediatR Pipeline: кэш оборачивает query-хендлер прозрачно. Хэндлер вообще не знает, что его результаты кэшируются.
var cached = await _cache.GetAsync<TResponse>(cacheKey);
if (cached != null) return cached;
var result = await next(); // реальный запрос к БД
await _cache.SetAsync(cacheKey, result, CacheKeyPrefixes.EmployeesAll);
return result;
• Domain Events инвалидация: CacheInvalidationEventHandler автоматически сбрасывает кэш при любой записи. RemoveByPrefixAsync чистит все Employees:GetAll:* за раз, без перебора ключей.
• Диагностические заголовки X-Cache-Status: HIT/MISS в каждом ответе. Видно прямо в DevTools — кэш работает или нет.
• Админские эндпоинты: POST /cache/invalidate и GET /cache/stats для ручного управления
Кэширование — это инфраструктура, не бизнес-логика. Хендлеры не знают о кэше, команды не знают об инвалидации.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_viewInstall-Package Cloudmersive.APIClient.NETCore.DLP -Version 1.1.0Сам вызов выглядит так:
using Cloudmersive.APIClient.NETCore.DLP.Api;
using Cloudmersive.APIClient.NETCore.DLP.Client;
using Cloudmersive.APIClient.NETCore.DLP.Model;
Configuration.Default.AddApiKey("Apikey", "YOUR_API_KEY");
var apiInstance = new RedactApi();
var body = new DlpDocumentRedactionRequest();
DlpDocumentRedactionResponse result = apiInstance.RedactDocument(body);
В ответе приходит отредактированный документ и набор флагов Contains* — по одному на каждый тип данных. Это удобно, если нужно не просто скрыть данные, но и зафиксировать факт их присутствия в документе для аудита. Отдельно возвращается список страниц, на которых были внесены правки.
Для использования нужен API-ключ Cloudmersive — регистрация на их сайте, есть бесплатное использование.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view VECTOR_SEARCH().
• MAUI тоже не обошли стороной. Улучшили работу карт, ускорили TypedBinding, добавили аннотации неизменяемости для Color и Font. Для Android теперь минимально требуется API 24.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#пульс_индустрииint threshold = 10; var query = items.Where(x => x > threshold);Код читается легко. Но когда лямбда захватывает threshold, компилятор может сгенерировать объект-замыкание для хранения этого состояния. Microsoft явно документирует static-лямбды как способ запретить захват и предотвратить лишние аллокации. Почему это проблема В обычном коде это, как правило, не критично. Но на горячем пути повторное создание замыканий превращается в постоянный трафик на куче. GC начинает работать чаще, а производительность становится непредсказуемой и всё это из-за одной строки, которая выглядит абсолютно безобидно. Как исправить Если захват не нужен, скажите об этом явно:
var query = items.Where(static x => x > 10);
Или вынесите логику в отдельный метод:
static bool IsAbove(int x, int threshold) => x > threshold;
Если лямбда находится на горячем пути, смотрите на неё глазами performance-инженера, а не просто читателя кода. Захват состояния это повод насторожиться.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминаторproduction вскрывает серьёзные проблемы: разработчикам приходится бороться с непредсказуемыми галлюцинациями моделей, нестабильными API и сложной интеграцией в существующую архитектуру.
Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции LLM.
Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинареvar windowSystem = new ConsoleWindowSystem(RenderMode.Buffer);
var window = new Window(windowSystem)
{
Title = "Hello World",
Width = 50,
Height = 15
};
windowSystem.AddWindow(window);
windowSystem.Run();
Начиная с версии 2.0 появился fluent API:
var window = new WindowBuilder(windowSystem)
.WithTitle("Modern Hello World")
.WithSize(50, 15)
.Centered()
.WithColors(Color.DarkBlue, Color.White)
.Build();
Прямой вывод в консоль в этой библиотеке нельзя использовать — он ломает рендеринг. Вместо этого есть встроенный сервис логирования, который пишет в файл. Включается через переменные окружения:
export SHARPCONSOLEUI_DEBUG_LOG=/tmp/consoleui.log
export SHARPCONSOLEUI_DEBUG_LEVEL=Debug
Библиотека поставляется с готовыми элементами управления. Среди них разметочный контрол на основе Spectre.Console, кнопки, чекбоксы, многострочный редактор текста с прокруткой, дерево для иерархических данных, список с выбором и табличная сетка.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view{
"version": "0.1.1",
"url": "https://example.com",
"vouches": [
{
"url": "https://trusted-person.com",
"vouched_at": "2026-01-15"
}
]
}
И в <head> добавляете:
<link rel="human-json">
Браузерное расширение видит эту ссылку и проверяет: есть ли у этого человека люди, которые его одобрили. Если есть, и они находятся на расстоянии 1-2 хопа от Вас, сайт получает зелёный индикатор.
Если Вы добавите human.json сейчас, Вы будете в первой волне. Это как было с SSL 15 лет назад.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view[McpServerTool(IconSource = "https://example.com/icon.svg")]
public static string GetWeather(string city) { }
Инструменты в запросах к модели
Сервер может включить инструменты в запрос к модели языка, и она их вызовет. Модель выполняет инструмент, сервер обрабатывает результат и отправляет обратно. Это может повторяться несколько раз.
На клиенте объявляйте поддержку:
var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(new() { Endpoint = new Uri("http://localhost:6184") }),
clientOptions: new()
{
Capabilities = new ClientCapabilities
{
Sampling = new SamplingCapability { Tools = new SamplingToolsCapability {} }
}
});
На сервере просто передавайте инструменты в запрос:
Tool rollDieTool = new Tool()
{
Name = "roll_die",
Description = "Rolls a six-sided die and returns 1-6."
};
Долгоживущие запросы
Раньше при разрыве соединения нужно было пересоединяться. Теперь сервер отправляет пустое событие с ID и может закрыть соединение. Клиент переподключится через этот ID.
На сервере:
builder.Services.AddDistributedMemoryCache();
builder.Services.AddMcpServer()
.WithHttpTransport()
.WithDistributedCacheEventStreamStore()
.WithTools<MyTools>();
В обработчик вызовите:
await context.EnablePollingAsync(retryInterval: TimeSpan.FromSeconds(5));
Задачи для долгих операций
Задачи хранят результаты надёжно и позволяют опрашивать состояние, получать результаты и отменять работу. Могут быть в состояниях: работает, требуется ввод, завершена, ошибка, отменена.
На сервере:
var taskStore = new InMemoryMcpTaskStore();
builder.Services.AddMcpServer(options => { options.TaskStore = taskStore; })
.WithHttpTransport();
Инструменты автоматически поддерживают задачи если возвращают Task:
[McpServerTool(TaskSupport = ToolTaskSupport.Required)]
public static async Task<string> ProcessData(int count, CancellationToken ct)
{
await Task.Delay(TimeSpan.FromSeconds(8), ct);
return $"Processed {count} records.";
}
На клиенте:
var result = await client.CallToolAsync(
new CallToolRequestParams
{
Name = "processDataset",
Task = new McpTaskMetadata { TimeToLive = TimeSpan.FromHours(2) }
});
var completedTask = await client.PollTaskUntilCompleteAsync(result.Task.TaskId);
Версия 1.0 это полноценная платформа для ИИ интеграции в .NET.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_newscreate_version() вместо create()
• Предварительные операции в подкаталоге .beta
REST API v1 GA
Foundry REST API v1 теперь production-ready. Все основные эндпоинты заморожены: чаты, ответы, встраивания, файлы, тонкая настройка, модели, хранилища векторов.
Если ваш SDK еще в pre-release, можете запросить REST API напрямую.
SDK обновления
.NET 2.0.0-beta.1: ImageBasedHostedAgentDefinition объединили с HostedAgentDefinition.
Foundry Local и VS Code
Foundry Local теперь поддерживает большие мультимодальные модели полностью автономно без облака.
AI Toolkit for VS Code v0.30.0 добавил Tool Catalog для поиска инструментов, Agent Inspector для дебага с F5 breakpoints и переделанный Agent Builder.
В марте SDK будут общедоступны. Обновитесь к RC сейчас, если используете.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
