C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Показати більше📈 Аналітичний огляд Telegram-каналу C# (C Sharp) programming
Канал C# (C Sharp) programming (@csharp_ci) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 18 051 підписників, посідаючи 7 230 місце в категорії Технології та додатки та 36 482 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 18 051 підписників.
За останніми даними від 26 жовтня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -33, а за останні 24 години на -8, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 18.96%. Протягом перших 24 годин після публікації контент зазвичай збирає 8.27% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 3 426 переглядів. Протягом першої доби публікація в середньому набирає 1 494 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 0.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як .net, api, логика, архитектура, string.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Завдяки високій частоті оновлень (останні дані отримано 27 жовтня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
Завантажуємо дані
| Дата | Залучення підписників | Згадування | Канали | |
| 27 жовтня | 0 | |||
| 26 жовтня | +1 | |||
| 25 жовтня | +2 | |||
| 24 жовтня | +6 | |||
| 23 жовтня | +3 | |||
| 22 жовтня | +1 | |||
| 21 жовтня | +1 | |||
| 20 жовтня | +4 | |||
| 19 жовтня | +4 | |||
| 18 жовтня | +9 | |||
| 17 жовтня | +7 | |||
| 16 жовтня | +7 | |||
| 15 жовтня | +5 | |||
| 14 жовтня | +3 | |||
| 13 жовтня | +9 | |||
| 12 жовтня | +4 | |||
| 11 жовтня | +8 | |||
| 10 жовтня | +2 | |||
| 09 жовтня | +5 | |||
| 08 жовтня | +5 | |||
| 07 жовтня | +7 | |||
| 06 жовтня | +11 | |||
| 05 жовтня | +9 | |||
| 04 жовтня | +8 | |||
| 03 жовтня | +2 | |||
| 02 жовтня | +1 | |||
| 01 жовтня | 0 |
Retry-After нужно настроить явно.
https://antondevtips.com/blog/aspnet-core-rate-limiting-algorithms-explained| 2 | «Ускорь этот C#-код» — полезнее просить ИИ вместе с инструкцией, как измерять результат.
BlazingFastDotnet — сборник приёмов оптимизации .NET 10 и 11, упакованный в SKILL.md для ИИ-агентов. Его можно читать и как обычный технический справочник.
Внутри:
- Поиск узких мест: dotnet-counters, dotnet-trace, Linux perf и анализ машинного кода JIT.
- Память и многопоточность: аллокации, GC, конкуренция за блокировки и false sharing.
- Настройка выполнения: ThreadPool, сокеты, JIT и параметры NativeAOT.
- Оптимизация C#: SIMD, работа со строками и ASP.NET Core.
Автор предлагает подключать документ по необходимости, когда появилась конкретная задача ускорения.
Порядок работы простой: замерить исходную производительность → найти причину → менять по одному параметру → сохранять только измеримый выигрыш.
Часть рекомендаций рассчитана прежде всего на бенчмарки. Настройки могут обменивать память на скорость или увеличивать нагрузку на CPU, поэтому переносить их в продакшен стоит после проверки на своей нагрузке.
https://github.com/EgorBo/BlazingFastDotnet | 1 764 |
| 3 | 🔐 «Не одобряй собственные расходы» — такое правило нужно проверять на сервере
Тайсир Джуде показывает, как защитить MCP-сервер на ASP.NET Core через Microsoft Entra ID.
На примере приложения для учёта расходов автор разбирает:
• Регистрацию сервера и клиента в Entra ID.
• Вход пользователя и проверку JWT-токенов.
• Разницу между scope - разрешением приложению действовать от имени пользователя — и ролью, позволяющей одобрять расходы.
• Ограничение доступа к отдельным MCP-инструментам и фильтрацию списка доступных tools.
Самый показательный момент: пользователь с ролью согласующего может одобрить чужой отчёт, но свой сервер отклонит. Личность определяется по токену, а бизнес-правило проверяется в коде.
Модель выбирает, какой инструмент вызвать. Сервер решает, разрешено ли выполнить действие.
📖 https://bitoftech.net/2026/10/13/securing-mcp-server-microsoft-entra-id/
#aspnetcore #dotnet #mcp | 2 804 |
| 4 | ⌨️ Магические слова async/await
Приглашаем на открытый урок.
🗓 29 ноября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «C#-разработчик. Продвинутый уровень».
Разберем, как браузер общается с сервером, и создадим работающий HTTP-сервис без Spring и сторонних библиотек.
О чем поговорим:
✔️ Как связаны понятия асинхронности и многопоточности
✔️ Синтаксис async/await-конструкций
✔️ Во что компилируется конструкция async/await
✔️ Работа с исключениями при ожидании
🔗 Ссылка на регистрацию: https://otus.pw/DCX1/?erid=2W5zFJeppAM
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. | 1 431 |
| 5 | 🧩 C# с подвохом: одна переменная — сколько запросов к БД?
В базе есть просроченные заказы. db.Orders — это DbSet<Order> в EF Core, а NotifyAsync к базе не обращается.
IEnumerable<Order> late = db.Orders
.Where(o => o.DueDate < today);
if (late.Any())
{
logger.LogWarning(
"{Count} late orders",
late.Count()
);
foreach (var order in late)
{
await notifier.NotifyAsync(order);
}
}
Сколько раз код обратится к базе и где будет выполняться подсчёт — в SQL или в памяти приложения?
Обратите внимание на тип late в первой строке. И изменится ли поведение, если заменить IEnumerable<Order> на var?
👇 Пишите ответ с объяснением. | 2 773 |
| 6 | ⚡ Где тормозит .NET-приложение? SharpLsp покажет прямо в VS Code
В SharpLsp есть встроенный профилировщик CPU и памяти для C# и F#. Подключаешься к уже работающему процессу и смотришь, на что приложение тратит ресурсы. Перезапускать и пересобирать его не нужно.
После сбора CPU-профиля расширение подсвечивает горячие строки кода, строит flame graph и показывает функции, которые занимают больше всего процессорного времени.
Для памяти доступны отслеживание кучи, сравнение снимков и граф ссылок, помогающий понять, что удерживает объекты в памяти. Подозреваемые на утечки отображаются по мере работы приложения.
Отдельно устанавливать `dotnet-trace` не требуется. Движку профилировщика нужен runtime .NET 8 или новее, а у целевого процесса должна быть включена диагностика.
Проект открытый, под лицензией MIT, работает на Windows, macOS и Linux.
https://sharplsp.dev/blog/dotnet-profiler-vs-code-csharp-fsharp/ | 2 861 |
| 7 | 🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: https://t.me/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: https://t.me/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://t.me/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: https://t.me/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд. | 1 936 |
| 8 | 🌐 Новый `HttpClient` на каждый запрос? Под нагрузкой это может закончиться исчерпанием портов.
IHttpClientFactory создаёт новые экземпляры клиента, но переиспользует обработчики `HttpMessageHandler` и их пулы соединений. Поэтому освобождение клиента, полученного от фабрики, не уничтожает пул после каждого запроса.
Три способа использования:
• Обычный клиент: CreateClient() для простых сценариев. Общие настройки тоже можно задать при регистрации.
• Именованный: CreateClient("github") возвращает клиент с настройками конкретного API.
• Типизированный: GitHubClient получает настроенный HttpClient через DI и скрывает детали HTTP за методами сервиса.
Например, именованный клиент:
services.AddHttpClient("github", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0");
});
// При использовании:
using var client = factory.CreateClient("github");
Нюанс: типизированный клиент не стоит надолго удерживать в singleton без настройки обновления соединений.
Фабрика также не единственный правильный вариант: Microsoft рекомендует и долгоживущий HttpClient с настроенным PooledConnectionLifetime. Главное: управлять временем жизни соединений. | 2 077 |
| 9 | 🛠 У .NET появился свой аналог rustup и nvm
Microsoft представила dotnetup: менеджер для установки и обновления .NET SDK и рантаймов. Пока в публичном превью.
Всё устанавливается в папку пользователя, без sudo и прав администратора. Можно держать стабильные версии, превью и ежедневные сборки рядом, а закрепление SDK через global.json сохраняется.
Несколько полезных команд:
dotnetup init # Настроить окружение
dotnetup list # Показать установленные версии
dotnetup update # Обновить отслеживаемые версии
dotnetup sdk install preview # Установить превью SDK
Можно отслеживать обновления внутри конкретной ветки или закрепить точную версию. При обновлении ненужные компоненты очищаются автоматически.
https://devblogs.microsoft.com/dotnet/introducing-dotnetup/ | 2 383 |
| 10 | Запрос проходит через несколько сервисов, обращается к базе данных и внешним API. Пользователь видит задержку или ошибку, а по отдельным записям в журналах трудно понять, на каком участке возникла проблема.
20 октября в 20:00 на открытом уроке курса «C# разработчик. Экспертный уровень» разберёте, как OpenTelemetry помогает превратить .NET-приложение из чёрного ящика в наблюдаемую систему.
Рассмотрите наблюдаемость и роль трассировок, метрик и журналов событий в исследовании работы приложения. Узнаете, как эти данные помогают получить целостное представление о пути запроса и искать причины ошибок и задержек.
На практике добавите средства сбора телеметрии в ASP.NET Core-приложение. Создадите собственные трассировки через ActivitySource и метрики через Meter, подключите автоматический сбор телеметрии для ASP.NET Core и HttpClient.
Урок проведёт Михаил Дмитриев.
Зарегистрироваться: https://otus.pw/f8Z4/?erid=2W5zFHPwe5P
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. | 2 313 |
| 11 | #ПятничныйКвиз | 2 349 |
| 12 | Что на самом деле происходит с вашим async-методом: компилятор C# переписывает его в конечный автомат
Meziantou разобрал, во что превращается async-метод после компиляции. Сам метод становится заглушкой: она создаёт структуру-автомат, заводит билдер вроде AsyncTaskMethodBuilder, копирует параметры в поля, ставит состояние -1, вызывает Start и возвращает Task. Вся логика переезжает в MoveNext.
В Release автомат это struct, в Debug это class. Пока метод не засыпает, автомат живёт на стеке. Как только он приостанавливается, билдер упаковывает его в кучу. Поле state хранит точку возобновления: -1 значит выполняется, -2 завершён, 0 и выше номер await. В поля уходят только параметры и локальные переменные, которые нужны после await, остальные остаются локальными. Слоты под awaiter выделяются на тип, а не на каждый await, поэтому несколько await на одном типе делят одно поле.
Сам await превращается в switch по полю плюс регистрацию продолжения. Если awaiter уже завершён, код идёт дальше без остановки. Если нет, сохраняется состояние и awaiter, вызывается AwaitUnsafeOnCompleted, и MoveNext возвращается. Исключения ловятся сгенерированным try/catch и уходят в SetException, поэтому всплывают на await, а не в месте вызова. До первого незавершённого await метод выполняется синхронно.
Бенчмарки автора показывают цену этого механизма: синхронный цикл 2,7 нс, async без реального ожидания 47,9 нс, async с приостановкой на каждой итерации 8820 нс. Разница в сотни раз в горячих циклах заметна, так что await на каждом элементе лучше пересобирать. Мерить стоит только в Release, иначе картина искажается.
Источник: https://www.meziantou.net/how-the-csharp-compiler-rewrites-an-async-method.htm | 2 453 |
| 13 | Helm-чарты прямо из C#, без запуска `helm` 🛠
HelmSharp позволяет рендерить шаблоны и управлять релизами Kubernetes внутри .NET-приложения.
Что умеет:
• Загружать чарты из папки и .tgz.
• Объединять values.yaml с пользовательскими параметрами.
• Упаковывать чарты и работать с HTTP-репозиториями.
• Устанавливать, обновлять, откатывать и удалять релизы.
• Хранить историю релизов в Kubernetes Secrets, совместимых с Helm v3.
Для начала:
dotnet add package HelmSharp.Action
Поддерживает .NET 8, 9 и 10, лицензия MIT.
Пригодится для собственных панелей управления и сервисов деплоя на C#. Совместимость с Helm пока частичная: свои чарты стоит проверить, особенно если они используют сложные шаблонные функции или расширения.
https://github.com/GaTTGeng/HelmSharp | 3 471 |
| 14 | Альфа-Банк ищет скиллового коллегу QA Fullstack на C#
Предлагаем полную удалёнку или гибридный график – у нас классные ИТ-офисы в Москве, Питере и Екатеринбурге.
Что нужно делать
– Разрабатывать автотесты на C#.
– Запускать функциональные, регрессионные и интеграционные тесты, включая API.
– Снижать количество дефектов в диалоге с разработкой и бизнесом.
Какие навыки важны
– Опыт автоматизации на C# и ручного тестирования от года.
– Знание API (SOAP, REST), SQL, основ клиент-серверной архитектуры и тест-дизайна.
Условия и развитие
– Сильное сообщество QA и C#-разработчиков: можно получить совет и поделиться опытом на митапе и в блоге на Хабре.
– Реальная перспектива роста: технический трек развития, в том числе до C#-лида
Оставляйте отклик по ссылке. | 2 497 |
| 15 | 🧱 Модульный монолит легко потерять одним удобным JOIN.
Допустим, модуль заказов напрямую читает таблицы доставки. Теперь изменение схемы доставки может сломать заказы, хотя в коде всё красиво разложено по модулям.
Границы стоит закреплять и в базе:
• Отдельная схема и роль PostgreSQL для каждого модуля.
• Роль получает права только на свои данные.
• В EF Core каждому модулю выделяется собственный DbContext и подключение с его учётными данными.
• Чужие данные доступны через API, события или специально опубликованные представления с правами только на чтение.
Так случайный запрос к чужой таблице остановит сама база. А выделять модуль в отдельный сервис впоследствии будет проще.
Нюанс: отдельная схема и search_path сами по себе доступа не ограничивают. Границу обеспечивают права ролей на схемы и объекты.
https://milanjovanovic.tech/blog/how-to-keep-your-data-boundaries-intact-in-a-modular-monolith | 3 102 |
| 16 | Задачка по C# 14: обновили проект на .NET 10, и код молча начал работать иначе
Что выведет этот код?
var c = new Counter();
c.Value = 5;
Console.WriteLine($"{c.Value} {c.Raw} {c.GetRaw()}");
class Counter
{
private int field = 100;
public int Value
{
get => field;
set => field = value;
}
public int Raw => field;
public int GetRaw() => field;
}
Варианты:
A) 5 5 5
😎 5 100 100
C) 5 0 100
D) Код не скомпилируется
Ответ: **C) 5 0 100**
В C# 14 слово `field` внутри аксессоров свойства стало ключевым. Теперь оно означает **скрытое поле, которое компилятор создаёт для этого свойства**, даже если в классе уже есть член с таким именем.
Поэтому в этом коде три разных `field`:
```
Value → своё скрытое поле: записали 5, прочитали 5
Raw → тоже аксессор, но со своим скрытым полем: в него никто не писал, значит 0
GetRaw() → обычный метод, ключевое слово тут не действует, это поле класса: 100
```
Главная ловушка в строке `public int Raw => field;`. Выглядит как обычный метод-однострочник, но это свойство, а значит get-аксессор. Поле класса со значением 100 здесь вообще не видно.
До C# 14 этот же код выводил `5 5 5`: все три обращения шли к одному полю класса. После обновления он компилируется и тихо меняет поведение. Чтобы обратиться к старому полю, внутри аксессоров нужно писать `this.field` или `@field`. | 3 324 |
| 17 | #ПятничныйКвиз | 3 358 |
| 18 | ⚡️ Microsoft переработала C# Dev Kit: меньше памяти, быстрее запуск
В версии 11.0 шесть процессов объединили в один сервер на Native AOT, добавили кэш проектов и приоритетную загрузку открытого файла.
На решении Aspire из 407 проектов Microsoft получила:
• готовность открытого файла: 0,47 секунды, ускорение до 180×;
• загрузка всего решения: 84,1 → 3 секунды;
• сборка после изменения одного C#-файла: 36,1 → 2,1 секунды;
• память сервера Dev Kit: 2072 → 316 МБ.
Последняя цифра относится только к серверу расширения: память VS Code и языкового сервиса Roslyn в сравнение не входит. Быстрая повторная загрузка использует предварительно созданный кэш.
Также появились подсказки и диагностика для .csproj, .props, .targets и C# Doctor для поиска проблем с SDK, восстановлением пакетов и окружением.
Версия доступна в Pre-Release. В VS Code откройте страницу C# Dev Kit и выберите Switch to Pre-Release Version.
https://devblogs.microsoft.com/dotnet/faster-lighter-csharp-dev-kit/ | 3 801 |
| 19 | 🛠 Вышел Microsoft.Data.SqlClient 7.1.1
Обновление .NET-драйвера для SQL Server исправляет три неприятных сценария:
• Нулевые decimal-параметры могли вызывать ArgumentException, если Precision совпадала со Scale.
• Пул соединений V2 мог выдавать соединения с истёкшими или почти истёкшими токенами доступа. Теперь срок проверяется перед повторным использованием. Исправление касается приложений, явно включивших V2.
• ClearPool и ClearAllPools могли приводить к ошибке при одновременном открытии соединения. Теперь уже начатые запросы могут завершиться, а соединения из очищенного пула больше не используются повторно.
https://github.com/dotnet/SqlClient/releases/tag/v7.1.1 | 3 703 |
| 20 | Одна задача, три языка: Rust, C# или C++?
В курсе Google *Comprehensive Rust* есть упражнение: найти длину трёхмерного вектора, а затем нормализовать его. Формула одна: √(x² + y² + z²). После этого каждую координату делим на полученную длину.
На скриншотах хорошо видна разница в стиле:
- Rust: iter().fold() собирает сумму квадратов, iter_mut() меняет координаты.
- C#: ReadOnlySpan для чтения, Span для изменения и обычный foreach.
- C++: std::vector, цикл по значениям для расчёта и по ссылкам для изменения.
Для тех, кто пишет на C#: Rust fold(0.0, ...) по смыслу близок к LINQ Aggregate(0.0, ...): оба сворачивают последовательность в одно значение через аккумулятор.
Чей вариант вам понятнее с первого взгляда? | 7 789 |
