C# Portal | Программирование
14.9K subscribers
912 photos
106 videos
24 files
758 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
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
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥5👎1
.NET 10 уже вышел!

Вот главные обновления по ключевым направлениям:

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? Пора обновляться.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍9👏2🥴1
Похоже, Entity Framework Core с .SqlQuery становится моим новым основным способом доступа к данным.

По моим неофициальным замерам, производительность выше, чем у Dapper, и при этом всё гораздо проще.

Чуть-чуть медленнее, чем чистый ADO.NET, но разница минимальная.
DbContext при этом остаётся максимально лёгким.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍97
Extension members в C# 14, пожалуй, лучшее, что Microsoft добавила в язык. Теперь можно писать такой чистый и лаконичный код.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴29👍12🔥7🤔3👏1
Новая версия AsyncAwaitBestPractices v10.0.0

Добавлена поддержка .NET 10

Та самая библиотека async/await, которую все любят, теперь собрана и оптимизирована под .NET 10.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴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
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴106👍2😁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
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯20👍5🥴4🤔3😁1
Ты уже смотрел на новый IExceptionHandler?

Исключения как-то обрабатывать все равно нужно.

IExceptionHandler реализует паттерн с префиксом Try-.
Ты сам решаешь, какие исключения обрабатывать.

Чтобы сообщить middleware, что ты обработал исключение, нужно вернуть true.

Так что же делает это таким интересным?

Можно выстраивать несколько обработчиков исключений в цепочку, и они будут вызываться по очереди.
Первый, который успешно обработает исключение, прерывает цепочку.

Вот как использовать это в .NET 10: читать

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥7👍4👏1
Решето Эратосфена на C#
(генератор простых чисел)

LINQ, поехали!

👉 @KodBlog
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63👌2👏1😁1
Понимание паттерна Observer это одна из базовых вещей, которую должен знать любой frontend-разработчик.

// Наблюдатели, которые выполняют 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("Доступно новое обновление.");


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5😁4
Это приложение прям отличный вариант для разработчиков. Показывает, какие порты у тебя открыты, и позволяет закрыть любой в один клик.

Опенсорсное и работает на Windows, Linux и macOS.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
15🔥6👏1😁1🤔1
Есть два способа настроить оптимистичный контроль конкурентности в EF Core:

1. Использовать атрибут [Timestamp] в модели сущности

2. Определить поле row version через Fluent API

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🌚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
Please open Telegram to view this post
VIEW IN TELEGRAM
👌9👍73🔥1
AsNoTracking() вроде ускоряет выполнение, но есть тонкий момент, о котором часто забывают, а именно о том , что он может создавать дубликаты сущностей в памяти.

Почему так происходит? Потому что без 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;
- требуется ссылочная целостность в графе объектов;
- запросы, возвращающие одну сущность несколько раз;
- требуется сравнивать сущности по ссылке.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Visual Studio 2026 официально вышла.

Раньше обновление Visual Studio автоматически тянуло за собой обновление .NET и C++ toolchain. Один пакет значит один риск. Хотел новые фичи IDE? Заодно получай новые компиляторы, нужные они тебе или нет.

В VS 2026 это разделили. IDE обновляется отдельно. Новые фичи прилетают раз в месяц. Build tools остаются в нужной версии.

Производительность подтянули по всем направлениям. Количество UI фризов уменьшилось на 50%. Запуск под F5 стал быстрее на 30% вместе с .NET 10. Большие решения загружаются ощутимо быстрее, а не только формально по цифрам.
Code coverage больше не только в Enterprise.

Теперь он доступен во всех версиях. Разработчики на Community и Professional могут анализировать покрытие тестами без апгрейда лицензии.

Интеграция с AI стала глубже. Copilot теперь понимает внешние символы в C#, а не только твой проект. Он может подтягивать контекст по URL. Debugger агент умеет автоматически чинить упавшие unit-тесты: предполагает причину, правит, проверяет и повторяет цикл, пока тест не пройдет.

Обратная совместимость полная. Проекты из VS 2022 открываются напрямую. Все 4000+ расширений работают без правок. Никакой миграции.

Fluent UI — самое заметное изменение, но далеко не главное. Главное то, что IDE стала быстрее, стабильнее и обновляется без принудительных обновлений compiler toolchain.

Что попробовать в первую очередь:
- Открой свою самую тяжелую solution и почувствуй разницу
- Запусти code coverage в Community/Professional
- Дай debugger агенту починить упавший тест

Уже доступно. Проекты и расширения из VS 2022 переносятся автоматически.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
24👍3👎2