C# (C Sharp) programming
18.1K subscribers
981 photos
52 videos
8 files
783 links
По всем вопросам- @notxxx1

Реестр РКН: https://clck.ru/3Fk3kb

#VRHSZ
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Unity подключила Claude Code, Codex и Grok к разработке игр 🎮

Компания опубликовала официальный плагин с 31 готовым скиллом для Unity 6+.

Агенту можно поручить конкретную задачу обычным текстом:

* создать экран настроек
* подключить внутриигровые покупки
* настроить физику или навигацию
* собрать мультиплеер и голосовой чат
* исправить проблемы со спрайтами
* настроить звук, локализацию, шейдеры и URP

Агент определяет нужную область Unity и загружает соответствующие инструкции. Плагин поддерживает Claude Code, Codex и Grok, устанавливается через их CLI и не содержит MCP-серверов или хуков.

https://github.com/Unity-Technologies/unity-agent-plugin#install
Please open Telegram to view this post
VIEW IN TELEGRAM
C# 14: задача на Span без аллокаций

Дана строка:


42|[email protected]|127


Нужно распарсить её без Split(), Regex и временных string:


public readonly record struct UserLog(
int Id,
ReadOnlyMemory<char> Email,
int Latency
);


Реализуйте:


static bool TryParse(
ReadOnlyMemory<char> input,
out UserLog result
)


Требования:

• парсинг через Span<char>
• false при битом формате
• без лишних аллокаций
• Email должен ссылаться на исходный buffer

Пример:


var input = "42|[email protected]|127".AsMemory();

if (TryParse(input, out var log))
{
Console.WriteLine(log.Id); // 42
Console.WriteLine(log.Email); // [email protected]
Console.WriteLine(log.Latency); // 127
}


Вопрос:

почему нельзя сохранить ReadOnlySpan<char> в UserLog, а ReadOnlyMemory<char> можно?
🔥 Microsoft выпустила .NET 11 RC1**- первый релиз-кандидат уже с **go-live support, то есть его можно использовать в production.

Из заметного: в C# 15 стабилизируют unions и другие новые возможности языка, ASP.NET Core получил обновления SignalR и OpenAPI, а в Blazor появились экспериментальные AI-компоненты для agentic UI.

В runtime добавили in-process crash reporting для Unix и аппаратные FP16-операции для Half. В SDK улучшили dotnet test, публикацию контейнеров и file-based programs, включая Native AOT reuse.

Также обновились F#, MAUI, WinForms, NuGet и MSBuild.

.NET 11 RC1 уже поддерживается в Visual Studio 2026 Insiders и VS Code с C# Dev Kit.

https://devblogs.microsoft.com/dotnet/dotnet-11-rc-1/
Please open Telegram to view this post
VIEW IN TELEGRAM
🧩 Задача на C#: почему воркер завис, хотя очередь почти пустая?

Есть канал вместимостью один элемент и единственный обработчик. Если задача завершилась ошибкой, обработчик возвращает её в очередь для повторной попытки.


using System.Threading.Channels;

var queue = Channel.CreateBounded<int>(
new BoundedChannelOptions(1)
{
FullMode = BoundedChannelFullMode.Wait,
SingleReader = true
});

await queue.Writer.WriteAsync(1);

var worker = Task.Run(async () =>
{
await foreach (var job in queue.Reader.ReadAllAsync())
{
Console.WriteLine($"Start {job}");

if (job == 1)
{
await queue.Writer.WriteAsync(2);
await queue.Writer.WriteAsync(1); // retry
}

Console.WriteLine($"Done {job}");
}
});

await worker;


Вопросы:

1. Что появится в консоли?
2. На какой строке остановится обработка?
3. Почему await и свободные потоки пула не спасают?
4. Если увеличить вместимость канала до двух, проблема исчезнет?
5. Как организовать не больше трёх попыток на задачу, сохранив ограниченную очередь и одного обработчика?

Условие: нельзя использовать Task.Run для каждой повторной попытки, неограниченную очередь или отбрасывание сообщений.

👇 Найдите причину зависания и предложите исправление.
Awesome Jev - большая подборка инструментов для новой модели TypeSafe AI 🤗

Jev - новая быстрая ИИ-модель от TypeSafe AI для принятия структурированных решений внутри программ. Она выбирает из заданных вариантов, оценивает вероятность и уверенность, вместо генерации длинного текста.

В одном репозитории собрали проекты, SDK, исследования и гайды для работы с Jev - моделью класса System One, созданной для быстрых типизированных решений внутри программ.

В подборке уже есть:

- агенты для macOS, Android и браузера;
- семантический поиск по кодовой базе;
- инструменты для проверки кода и ответов LLM;
- плагины для Codex и Claude Code;
- MCP-серверы и SDK для Python, TypeScript, Go, Rust, .NET и других языков;
- демо с Doom, Mario, StarCraft, Civilization II и управлением дроном.

Jev возвращает структурированные решения с вероятностями и оценкой уверенности. Заявленная скорость ответа - 70–500 мс, стоимость - $0,042 за 1 млн входных токенов, выходные токены бесплатны.

🔗 GitHub: https://github.com/AnotiaWang/awesome-jev
🐞 Когда логов недостаточно: дамп памяти из C#

Баг возникает только на проде, а локально всё работает? Дамп позволяет сохранить состояние процесса и позже изучить стеки потоков и значения переменных, не воспроизводя проблему заново.

В .NET Blog разбирают создание дампа текущего процесса из C# на Windows через нативную библиотеку dbghelp.dll. Это способ встроить сбор диагностических данных прямо в приложение.

Полезно для тех, кто разбирается с трудноуловимыми сбоями и хочет видеть больше, чем сообщение об исключении.

https://devblogs.microsoft.com/dotnet/creating-a-memory-dump-in-csharp/
⚡ .NET 11 ускорили почти везде - от JIT и GC до LINQ и networking

Stephen Toub выпустил огромный разбор производительности .NET 11. Главная идея релиза — сотни небольших оптимизаций, которые вместе заметно уменьшают allocations, количество инструкций и стоимость горячих участков кода.

Что улучшили:

- JIT лучше деvirtualизирует вызовы и инлайнит код;
- расширили escape analysis - больше временных объектов остаётся на stack вместо heap;
- убираются лишние boxing и allocations;
- ускорены коллекции, LINQ, sorting и JSON;
- улучшены SIMD, threading и networking;
- многие оптимизации работают без изменения исходного кода приложения.
-
Показательный пример: в одном из тестов обработка nullable-значения ускорилась примерно с 9,6 нс до 2 нс, а временная allocation на 24 байта исчезла полностью. В другом случае foreach по IEnumerable<int> стал примерно в 5 раз быстрее и тоже перестал создавать лишний объект.

Разбор Microsoft: https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-11/
🌦️ Красивый пример того, как может выглядеть современное приложение на Aspire

Команда показала полноценную интерактивную карту погоды на Node.js с живыми прогнозами и анимированным радаром.

Под капотом:

⚡ Express + OpenTelemetry API
⚛️ React 19 + Vite
🗺️ Leaflet для карты
🛰️ анимированный погодный радар и актуальные прогнозы
🧩 всё приложение оркестрируется через TypeScript AppHost

Хороший пример Aspire не в виде очередного Hello World, а как основа для полноценного приложения из нескольких сервисов.

https://aspire.dev/reference/samples/

@csharp_ci
🖥 C# снова показывает, что «удобный язык = медленный язык» давно не работает.

Автор ttfx портировал инструмент на C# и получил:

- до 140× быстрее Python
- до 2,12× быстрее Rust-версии 0.3.3, на которую ранее ссылался DHH

И всё это на Linux.

Современный C# здесь особенно интересен не только для backend: он отлично подходит для CLI, утилит, bash-подобных скриптов, сервисов и обычных приложений, при этом без заметной жертвы в производительности.

Хороший пример того, насколько далеко .NET ушёл от старого образа «Windows-only и тяжёлый runtime».

https://github.com/devmobasa/ttfx
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Самый неожиданный кандидат на звание самого быстрого JSON-сериализатора для .NET сейчас делает… CAPCOM.

Компания открыла REDox — высокопроизводительный движок для структурированных данных на C#, который используется как часть технологий вокруг её next-gen game engine.

REDox умеет работать не только с JSON, но и с:

- CBOR
- MessagePack
- TOML
- XML

Это компактный token-based DOM с упором на скорость и минимальные аллокации. Проект рассчитан на горячие пути вроде игровых конфигов и сериализации больших объёмов данных.

И да, речь о технологиях CAPCOM, стоящих за движком, на котором работают современные Resident Evil / Biohazard и другие игры компании.

Один из самых интересных .NET-проектов по сериализации пришёл не от Microsoft, а от разработчиков Resident Evil.

https://github.com/CAPCOM-TD-OSS/REDox
🖥 .NET 10 научился класть объекты на стек: escape analysis в JIT

Одна из самых полезных оптимизаций в .NET 10 работает незаметно. JIT проверяет, может ли объект пережить метод, в котором его создали. Если не может, объект размещается на стеке, а не в куче. Сборщику мусора отслеживать нечего, а сам объект можно разложить на отдельные поля и оптимизировать дальше.

Раньше это работало только для простых случаев. В .NET 10 на стек попадают ещё четыре вида объектов.

Маленькие массивы фиксированного размера, причём и из значимых типов, и из ссылочных:


int[] numbers = { 1, 2, 3 }; // теперь на стеке
string[] words = { "Hello", "World!" }; // тоже на стеке


Делегаты. Если лямбда не выходит за пределы метода, объект Func больше не уходит в кучу. Замыкание пока ещё аллоцируется, но это обещают доделать.

Объекты в полях локальных структур. Если массив лежит в поле структуры, а структура не покидает метод, массив тоже размещается на стеке. В ассемблере пропадает вызов аллокатора.

Заодно в JIT добавили девиртуализацию интерфейсов массивов, поэтому foreach по IEnumerable<T> над массивом теперь инлайнится. Ещё улучшили loop inversion и раскладку кода, а на Arm64 пауз GC стало меньше на 8–20%.

Переписывать ничего не нужно: привычный код с лямбдами и маленькими массивами просто начинает аллоцировать меньше после перехода на .NET 10.

https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/runtime#escape-analysis
Please open Telegram to view this post
VIEW IN TELEGRAM
🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК

Приглашаем на открытое собеседование: Senior C# разработчик проведёт его в прямом эфире. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.

Как это будет:
📂 Собеседует Александр Моргунов — Senior C# разработчик, 7+ лет в европейских высоконагруженных сервисах. Отвечает разработчик-доброволец;

📂 Всё как на настоящем собесе: Александр задаёт те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;

📂 После каждого ответа Александр даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;

📂 В конце можно задать любой вопрос.

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир -> @shortcut_csharp_bot

Реклама.
О рекламодателе.
Одна задача, три языка: 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, ...): оба сворачивают последовательность в одно значение через аккумулятор.

Чей вариант вам понятнее с первого взгляда?

@csharp_ci
🛠 Вышел 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