Краткое обновление по .NET 10 — версия готовится к выходу и приносит много интересного. Ниже главное, что удалось собрать.
✅ Подтверждённые изменения:
Версия .NET 10 получит статус LTS (Long-Term Support) с поддержкой несколько лет.
Основные улучшения в рантайме: оптимизация JIT, улучшенная инлайнинг/девиртуализация, улучшения для struct-аргументов.
Новое в C# 14: поддержка модификаторов параметров в лямбдах (ref, in, out), расширенные возможности field-ключевого слова, «extension blocks», null-conditional assignment и др.
В ASP.NET Core / Blazor: улучшения производительности, новые возможности для WebAssembly, улучшенная валидация форм и др.
Несколько оговорок:
Хотя вы могли увидеть сообщение «.NET 10 уже вышел сегодня», официальная GA-дата запланирована на 11 ноября 2025.
InfoQ
Сейчас доступны версии RC (Release Candidate) с поддержкой «go-live».
Не все анонсированные функции ещё подтверждены полностью либо ещё не вошли в стабильную версию.
👉 @KodBlog
Версия .NET 10 получит статус LTS (Long-Term Support) с поддержкой несколько лет.
Основные улучшения в рантайме: оптимизация JIT, улучшенная инлайнинг/девиртуализация, улучшения для struct-аргументов.
Новое в C# 14: поддержка модификаторов параметров в лямбдах (ref, in, out), расширенные возможности field-ключевого слова, «extension blocks», null-conditional assignment и др.
В ASP.NET Core / Blazor: улучшения производительности, новые возможности для WebAssembly, улучшенная валидация форм и др.
Несколько оговорок:
Хотя вы могли увидеть сообщение «.NET 10 уже вышел сегодня», официальная GA-дата запланирована на 11 ноября 2025.
InfoQ
Сейчас доступны версии RC (Release Candidate) с поддержкой «go-live».
Не все анонсированные функции ещё подтверждены полностью либо ещё не вошли в стабильную версию.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥5👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Понимай любую кодовую базу за секунды прямо в VS Code 🤯
Это расширение превращает весь твой проект в наглядную архитектурную визуализацию / показывает, как всё связано, двигается и зависит друг от друга.
Идеально, когда ты подключаешься к новому репозиторию или возвращаешься к старому.
Что делать:
1. Установи расширение Swark
2. Открой Command Palette (Ctrl + Shift + P)
3. Введи “Swark: Create Architecture Diagram” и выбери команду
4. Укажи корневую папку проекта
👉 @KodBlog
Это расширение превращает весь твой проект в наглядную архитектурную визуализацию / показывает, как всё связано, двигается и зависит друг от друга.
Идеально, когда ты подключаешься к новому репозиторию или возвращаешься к старому.
Что делать:
1. Установи расширение Swark
2. Открой Command Palette (Ctrl + Shift + P)
3. Введи “Swark: Create Architecture Diagram” и выбери команду
4. Укажи корневую папку проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥5👎1
.NET 10 уже вышел!
Вот главные обновления по ключевым направлениям:
Нужна стартовая точка под .NET 10? Пора обновляться.
👉 @KodBlog
Вот главные обновления по ключевым направлениям:
C# 14
— расширяемые члены, свойства с полями, implicit spans и обновлённый nameof с поддержкой лямбд. Код стал чище и лаконичнее.
ASP.NET Core
— улучшенная поддержка OpenAPI, встроенная валидация для Minimal API, Server-Sent Events (SSE) и аутентификация с passkey.
EF Core
— добавлен поиск по векторам в SQL, улучшен LINQ–SQL перевод, появились Complex Types и полнотекстовый поиск в Cosmos DB.
Runtime
— прокачанный JIT-компилятор, больше stack allocation, поддержка AVX10.2 и улучшенный NativeAOT — приложения стали легче и быстрее.
Библиотеки
— новые криптографические API, свежие опции для JSON-сериализации, новый WebSocketStream API и ускоренная работа с ZipArchive.
SDK
— апдейты для file-based apps, поддержка контейнеров в консольных приложениях, tab-completion и команда dotnet tool exec.
Aspire
— полноценная поддержка Python и JS, деплой через Aspire Do, контейнеры как артефакты и новый AppHost CLI.
.NET MAUI
— улучшена диагностика и телеметрия верстки, добавлен XAML source generator, обновлён MediaPicker и шаблон Aspire service-defaults.
Нужна стартовая точка под .NET 10? Пора обновляться.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18👍9👏2🥴1
Похоже, Entity Framework Core с .SqlQuery становится моим новым основным способом доступа к данным.
По моим неофициальным замерам, производительность выше, чем у Dapper, и при этом всё гораздо проще.
Чуть-чуть медленнее, чем чистый
DbContext при этом остаётся максимально лёгким.
👉 @KodBlog
По моим неофициальным замерам, производительность выше, чем у Dapper, и при этом всё гораздо проще.
Чуть-чуть медленнее, чем чистый
ADO.NET, но разница минимальная.DbContext при этом остаётся максимально лёгким.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍9❤7
Extension members в C# 14, пожалуй, лучшее, что Microsoft добавила в язык. Теперь можно писать такой чистый и лаконичный код.
👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴30👍13🔥7🤔3👏1
Новая версия AsyncAwaitBestPractices v10.0.0
✅ Добавлена поддержка .NET 10
Та самая библиотека async/await, которую все любят, теперь собрана и оптимизирована под .NET 10.
👉 @KodBlog
Та самая библиотека async/await, которую все любят, теперь собрана и оптимизирована под .NET 10.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - TheCodeTraveler/AsyncAwaitBestPractices: Extensions for System.Threading.Tasks.Task and System.Threading.Tasks.ValueTask
Extensions for System.Threading.Tasks.Task and System.Threading.Tasks.ValueTask - TheCodeTraveler/AsyncAwaitBestPractices
🥴7👍5🔥2
Оптимизация запроса в EF Core снизила время выполнения с 30 секунд до 30 миллисекунд.
Вот какие шаги помогли
Исходный запрос был из реального проекта соцсети.
Сущности и связи:
Users — у каждого много постов и комментариев
Comments — привязаны к юзеру и посту
Categories — у постов есть категория
Posts — имеют категорию и множество лайков
Likes — относятся к конкретному посту
Задача:
Выбрать топ 5 пользователей, которые оставили больше всего комментариев за последние 7 дней под постами категории .NET.
Для каждого нужно вернуть:
- UserId
- Username
- количество комментариев (только под .NET постами за последние 7 дней)
- топ 3 .NET поста по лайкам, которые этот пользователь чаще всего комментировал (PostId, LikesCount)
Что было сделано для ускорения:
- Предфильтрация пользователей
- Ограничение до топ-5
- Сокращение числа JOIN
- Проекция только нужных полей
- Формирование результата в одном запросе
- Использование AsSplitQuery
- Трехфазный подход
- Двухфазный подход
Подробности можно посмотреть здесь
👉 @KodBlog
Вот какие шаги помогли
Исходный запрос был из реального проекта соцсети.
Сущности и связи:
Users — у каждого много постов и комментариев
Comments — привязаны к юзеру и посту
Categories — у постов есть категория
Posts — имеют категорию и множество лайков
Likes — относятся к конкретному посту
Задача:
Выбрать топ 5 пользователей, которые оставили больше всего комментариев за последние 7 дней под постами категории .NET.
Для каждого нужно вернуть:
- UserId
- Username
- количество комментариев (только под .NET постами за последние 7 дней)
- топ 3 .NET поста по лайкам, которые этот пользователь чаще всего комментировал (PostId, LikesCount)
Что было сделано для ускорения:
- Предфильтрация пользователей
- Ограничение до топ-5
- Сокращение числа JOIN
- Проекция только нужных полей
- Формирование результата в одном запросе
- Использование AsSplitQuery
- Трехфазный подход
- Двухфазный подход
Подробности можно посмотреть здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴10❤6👍4😁1
Media is too big
VIEW IN TELEGRAM
WinForms приложения на .NET Framework можно переехать в web на .NET 9+ и задеплоить в Azure App Services через Visual Studio и copilot за пару минут.
Вся логика приложения и бизнес-код сохраняются.
Сочетание Visual Studio 2026 и GitHub Copilot творит вещи.
👉 @KodBlog
Вся логика приложения и бизнес-код сохраняются.
Сочетание Visual Studio 2026 и GitHub Copilot творит вещи.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯20👍6🥴4🤔3😁1
Ты уже смотрел на новый IExceptionHandler?
Исключения как-то обрабатывать все равно нужно.
IExceptionHandler реализует паттерн с префиксом Try-.
Ты сам решаешь, какие исключения обрабатывать.
Чтобы сообщить middleware, что ты обработал исключение, нужно вернуть true.
Так что же делает это таким интересным?
Можно выстраивать несколько обработчиков исключений в цепочку, и они будут вызываться по очереди.
Первый, который успешно обработает исключение, прерывает цепочку.
Вот как использовать это в .NET 10: читать
👉 @KodBlog
Исключения как-то обрабатывать все равно нужно.
IExceptionHandler реализует паттерн с префиксом Try-.
Ты сам решаешь, какие исключения обрабатывать.
Чтобы сообщить middleware, что ты обработал исключение, нужно вернуть true.
Так что же делает это таким интересным?
Можно выстраивать несколько обработчиков исключений в цепочку, и они будут вызываться по очереди.
Первый, который успешно обработает исключение, прерывает цепочку.
Вот как использовать это в .NET 10: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥7👍5👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🥴5
Вышло новое сравнение популярных подходов для массовой вставки данных в SQL Server. После практических тестов самым быстрым решением оказался SqlBulkCopy. Он требует больше кода и немного ручной настройки, но по скорости уверенно обгоняет альтернативы.
Для PostgreSQL аналогом выступает команда COPY, работающая по схожему принципу и тоже показывающая отличный перфоманс.
Помимо этого протестированы еще пять других методов, включая варианты с EF Core и C#. Полное сравнение доступно по ссылке
👉 @KodBlog
Для PostgreSQL аналогом выступает команда COPY, работающая по схожему принципу и тоже показывающая отличный перфоманс.
Помимо этого протестированы еще пять других методов, включая варианты с EF Core и C#. Полное сравнение доступно по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3👌2👏1😁1
Понимание паттерна Observer это одна из базовых вещей, которую должен знать любой frontend-разработчик.
👉 @KodBlog
// Наблюдатели, которые выполняют Update, когда получают уведомление
interface IObserver
{
void Update(string message);
}
// Субъект, который уведомляет подписанных наблюдателей
interface ISubject
{
// Регистрация, удаление и уведомление наблюдателей
void Register(IObserver observer);
void Unregister(IObserver observer);
void Notify(string message);
}
// Конкретная реализация субъекта, который рассылает обновления подписчикам
class ConcreteSubject : ISubject
{
private readonly List<IObserver> observers = new();
public void Register(IObserver observer)
{
observers.Add(observer);
}
public void Unregister(IObserver observer)
{
observers.Remove(observer);
}
public void Notify(string message)
{
foreach (var observer in observers)
{
observer.Update(message);
}
}
}
// Конкретная реализация наблюдателя, который реагирует на уведомления субъекта
class ConcreteObserver : IObserver
{
private readonly string name;
public ConcreteObserver(string name)
{
this.name = name;
}
public void Update(string message)
{
Console.WriteLine($"{name} получил сообщение: {message}");
}
}
// Создаем субъект и наблюдателей
var subject = new ConcreteSubject();
var observer1 = new ConcreteObserver("Наблюдатель 1");
var observer2 = new ConcreteObserver("Наблюдатель 2");
// Подписываем наблюдателей на субъект
subject.Register(observer1);
subject.Register(observer2);
// Субъект меняет состояние и уведомляет подписчиков
subject.Notify("Состояние изменилось.");
subject.Notify("Доступно новое обновление.");
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍6😁4
Это приложение прям отличный вариант для разработчиков. Показывает, какие порты у тебя открыты, и позволяет закрыть любой в один клик.
Опенсорсное и работает на Windows, Linux и macOS.
👉 @KodBlog
Опенсорсное и работает на Windows, Linux и macOS.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥7👏1😁1🤔1
Производительность платежной системы в проде была увеличена примерно в 15 раз — всего одной строкой кода в EF Core
Система обрабатывает массовые платежи, разбивая один запрос на множество аккаунтов получателей.
В тестах всё работало нормально, но при переходе в прод с реальными объёмами данных API стал тратить секунды на обработку одного запроса по нескольким тысячам счетов.
Каждый платежный запрос делает выборку из таблицы payment_accounts, чтобы определить счета, которые еще не были полностью оплачены.
Тест на 19 000 аккаунтов в SQL Server показал время обработки: 8.22 секунды.
Требование SLA (p99): 1 секунда.
API был примерно в 8 раз медленнее порога SLA.
Основная проблема оказалась в методе SaveChangesAsync.
EF Core умеет группировать несколько вставок, но база данных все равно выполняет их по отдельности.
В SQL Server EF Core использует оператор MERGE для массовых вставок, но подход ограничен лимитом SQL-параметров (2100 на батч). Если у сущностей много полей = производительность быстро падает.
После оптимизаций стало понятно, что штатными инструментами EF Core не удастся добиться нужной скорости.
Решением стала библиотека Entity Framework Extensions.
Она даёт простой, гибкий и быстрый способ для bulk-вставок, позволяя вставлять тысячи записей за один запрос к базе.
Методы BulkInsert и BulkInsertOptimized позволяют выполнить массовую вставку буквально одной строкой кода.
С их помощью время вставки удалось снизить до 521 мс, что укладывается в SLA.
👉 @KodBlog
Система обрабатывает массовые платежи, разбивая один запрос на множество аккаунтов получателей.
В тестах всё работало нормально, но при переходе в прод с реальными объёмами данных API стал тратить секунды на обработку одного запроса по нескольким тысячам счетов.
Каждый платежный запрос делает выборку из таблицы payment_accounts, чтобы определить счета, которые еще не были полностью оплачены.
Тест на 19 000 аккаунтов в SQL Server показал время обработки: 8.22 секунды.
Требование SLA (p99): 1 секунда.
API был примерно в 8 раз медленнее порога SLA.
Основная проблема оказалась в методе SaveChangesAsync.
EF Core умеет группировать несколько вставок, но база данных все равно выполняет их по отдельности.
В SQL Server EF Core использует оператор MERGE для массовых вставок, но подход ограничен лимитом SQL-параметров (2100 на батч). Если у сущностей много полей = производительность быстро падает.
После оптимизаций стало понятно, что штатными инструментами EF Core не удастся добиться нужной скорости.
Решением стала библиотека Entity Framework Extensions.
Она даёт простой, гибкий и быстрый способ для bulk-вставок, позволяя вставлять тысячи записей за один запрос к базе.
Методы BulkInsert и BulkInsertOptimized позволяют выполнить массовую вставку буквально одной строкой кода.
С их помощью время вставки удалось снизить до 521 мс, что укладывается в SLA.
Please open Telegram to view this post
VIEW IN TELEGRAM
👌12👍9❤3🔥1
AsNoTracking() вроде ускоряет выполнение, но есть тонкий момент, о котором часто забывают, а именно о том , что он может создавать дубликаты сущностей в памяти.
Почему так происходит? Потому что без change tracker EF Core не делает identity resolution - он не проверяет, была ли эта сущность уже загружена ранее. В итоге можно получить несколько объектов, которые на самом деле представляют одну и ту же запись в базе.
Пример:
Если у нескольких заказов один и тот же пользователь, то Customer будет склонирован под каждый заказ. То есть:
• больше памяти
• сравнение сущностей по ссылке становится бесполезным
• нарушается связность графа объектов
Решение — AsNoTrackingWithIdentityResolution()
Этот метод даёт баланс:
• нет change tracking (то есть быстрый чтение-only режим)
• есть identity resolution (одна сущность — один объект)
Пример:
Теперь все заказы, у которых один и тот же Customer, будут ссылаться ровно на один объект пользователя.
Как это работает внутри:
• запрос выполняется без отслеживания
• EF Core создаёт временную identity map
• сущности с одинаковым ключом получат одинаковый объект
• карта удаляется после завершения запроса
То есть tracking нет, но дубликатов тоже нет.
Если это поведение нужно часто, его можно включить по умолчанию:
Когда использовать:
1. Отслеживание по умолчанию:
- необходимо обновлять, удалять или отслеживать изменения сущностей;
- небольшие наборы результатов, где затраты на отслеживание незначительны;
- необходимо автоматическое обнаружение изменений.
2. AsNoTracking:
- операции только чтения;
- нет свойств навигации или связанных сущностей;
- максимальная производительность критически важна;
- результаты не содержат дублирующихся сущностей.
3. AsNoTrackingWithIdentityResolution:
- операции только чтения с include/join;
- требуется ссылочная целостность в графе объектов;
- запросы, возвращающие одну сущность несколько раз;
- требуется сравнивать сущности по ссылке.
👉 @KodBlog
Почему так происходит? Потому что без change tracker EF Core не делает identity resolution - он не проверяет, была ли эта сущность уже загружена ранее. В итоге можно получить несколько объектов, которые на самом деле представляют одну и ту же запись в базе.
Пример:
var orders = await context.Orders
.AsNoTracking()
.Include(o => o.Customer)
.Where(o => o.OrderDate > DateTime.Now.AddDays(-30))
.ToListAsync();
Если у нескольких заказов один и тот же пользователь, то Customer будет склонирован под каждый заказ. То есть:
• больше памяти
• сравнение сущностей по ссылке становится бесполезным
• нарушается связность графа объектов
Решение — AsNoTrackingWithIdentityResolution()
Этот метод даёт баланс:
• нет change tracking (то есть быстрый чтение-only режим)
• есть identity resolution (одна сущность — один объект)
Пример:
var orders = await context.Orders
.AsNoTrackingWithIdentityResolution()
.Include(o => o.Customer)
.Where(o => o.OrderDate > DateTime.Now.AddDays(-30))
.ToListAsync();
Теперь все заказы, у которых один и тот же Customer, будут ссылаться ровно на один объект пользователя.
Как это работает внутри:
• запрос выполняется без отслеживания
• EF Core создаёт временную identity map
• сущности с одинаковым ключом получат одинаковый объект
• карта удаляется после завершения запроса
То есть tracking нет, но дубликатов тоже нет.
Если это поведение нужно часто, его можно включить по умолчанию:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(connectionString)
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTrackingWithIdentityResolution);
}
Когда использовать:
1. Отслеживание по умолчанию:
- необходимо обновлять, удалять или отслеживать изменения сущностей;
- небольшие наборы результатов, где затраты на отслеживание незначительны;
- необходимо автоматическое обнаружение изменений.
2. AsNoTracking:
- операции только чтения;
- нет свойств навигации или связанных сущностей;
- максимальная производительность критически важна;
- результаты не содержат дублирующихся сущностей.
3. AsNoTrackingWithIdentityResolution:
- операции только чтения с include/join;
- требуется ссылочная целостность в графе объектов;
- запросы, возвращающие одну сущность несколько раз;
- требуется сравнивать сущности по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍2