В C# 16 разработчики планируют сосредоточиться на нескольких крупных направлениях:
Среди них — развитие
https://github.com/dotnet/csharplang/discussions/10276/
Как вам такой набор изменений?
👉 @KodBlog
Среди них — развитие
unsafe, новый синтаксис для словарей, закрытые enum, улучшенный вывод типов и более удобное декларативное создание интерфейсов.https://github.com/dotnet/csharplang/discussions/10276/
Как вам такой набор изменений?
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
Feature focus in the C# 16 cycle · dotnet csharplang · Discussion #10276
Feature focus in the C# 16 cycle Here's where I believe we should apply our resources over the next year or so. Unsafe v2 https://github.com/dotnet/csharplang/blob/main/proposals/unsafe-evoluti...
🍾4🌭2
Сегодня у меня для вас небольшая задачка.
Оба метода удаляют один товар и возвращают одинаковые HTTP-статусы, но…
Под капотом они работают совершенно по-разному.
Какую реализацию выбрали бы вы?
Сможете определить различия?
Пишите свои варианты решения в комментариях!
Приятного брейншторма! 🧠
👉 @KodBlog
Оба метода удаляют один товар и возвращают одинаковые HTTP-статусы, но…
Под капотом они работают совершенно по-разному.
Какую реализацию выбрали бы вы?
Сможете определить различия?
Пишите свои варианты решения в комментариях!
Приятного брейншторма! 🧠
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾2❤1
Строки в C# кажутся простой темой — пока не становятся причиной:
❌ нечитаемого кода
❌ лишних аллокаций
❌ скрытых ошибок при сравнении
❌ некорректной валидации
❌ неудобного форматирования многострочного текста
В своих проектах я придерживаюсь пяти правил:
1. Использую интерполяцию строк
2. Для большого количества конкатенаций применяю
3. Проверяю строки через
4. Явно указываю
5. Использую raw- или verbatim-строки
Меньше экранирования.
Меньше лишнего шума.
Более читаемый код.
Даже небольшие улучшения в работе со строками делают код безопаснее, чище и проще в поддержке.
👉 @KodBlog
❌ нечитаемого кода
❌ лишних аллокаций
❌ скрытых ошибок при сравнении
❌ некорректной валидации
❌ неудобного форматирования многострочного текста
В своих проектах я придерживаюсь пяти правил:
1. Использую интерполяцию строк
2. Для большого количества конкатенаций применяю
StringBuilder3. Проверяю строки через
string.IsNullOrWhiteSpace4. Явно указываю
StringComparison5. Использую raw- или verbatim-строки
Меньше экранирования.
Меньше лишнего шума.
Более читаемый код.
Даже небольшие улучшения в работе со строками делают код безопаснее, чище и проще в поддержке.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🍌1😐1🍾1
Паттерн Saga — одна из базовых вещей, которую стоит понимать при работе с распределёнными системами.
Он помогает поддерживать согласованность в долгих бизнес-процессах, где участвуют сразу несколько микросервисов. Вместо одной общей транзакции процесс разбивается на последовательность локальных транзакций, а завершение каждого шага запускает следующий.
Обычно Saga строится одним из двух способов:
через хореографию, когда сервисы сами обмениваются событиями;
через оркестрацию, когда всем процессом управляет отдельный координатор.
Но самое важное начинается не на happy path, а при сбоях. Для каждого шага нужно заранее продумать, что делать, если он завершится ошибкой: откатить предыдущие действия, запустить компенсирующую операцию или выбрать другой сценарий.
И здесь нет универсального ответа — решение зависит от логики конкретного бизнеса.
👉 @KodBlog
Он помогает поддерживать согласованность в долгих бизнес-процессах, где участвуют сразу несколько микросервисов. Вместо одной общей транзакции процесс разбивается на последовательность локальных транзакций, а завершение каждого шага запускает следующий.
Обычно Saga строится одним из двух способов:
через хореографию, когда сервисы сами обмениваются событиями;
через оркестрацию, когда всем процессом управляет отдельный координатор.
Но самое важное начинается не на happy path, а при сбоях. Для каждого шага нужно заранее продумать, что делать, если он завершится ошибкой: откатить предыдущие действия, запустить компенсирующую операцию или выбрать другой сценарий.
И здесь нет универсального ответа — решение зависит от логики конкретного бизнеса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👌3🍾1
Вот 8 простых приёмов, которые делают код чище:
✅ Используйте result objects
✅ Объединяйте
✅ Применяйте early return
✅ Заменяйте magic strings на
✅ Предпочитайте собственные исключения
✅ Используйте LINQ, когда он делает код короче и понятнее
✅ Заменяйте magic numbers на константы
✅ Выносите сложные булевы выражения в отдельные методы
Хороший разработчик часто замечает code smells с первого взгляда.
👉 @KodBlog
✅ Используйте result objects
✅ Объединяйте
if, когда условия можно выразить вместе✅ Применяйте early return
✅ Заменяйте magic strings на
enum✅ Предпочитайте собственные исключения
✅ Используйте LINQ, когда он делает код короче и понятнее
✅ Заменяйте magic numbers на константы
✅ Выносите сложные булевы выражения в отдельные методы
Хороший разработчик часто замечает code smells с первого взгляда.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🍾2
Как обычно рисуют архитектурные диаграммы?
Самый распространённый вариант — UML-диаграммы.
Но есть и другой подход — модель C4.
C4 расшифровывается как:
Context Diagram — диаграмма контекста системы
Container Diagram — диаграмма контейнеров
Component Diagram — диаграмма компонентов
Code Diagram — диаграмма кода
Это лёгкая модель для описания архитектуры, которая помогает постепенно раскрывать систему: от общего представления до деталей реализации.
👉 @KodBlog
Самый распространённый вариант — UML-диаграммы.
Но есть и другой подход — модель C4.
C4 расшифровывается как:
Context Diagram — диаграмма контекста системы
Container Diagram — диаграмма контейнеров
Component Diagram — диаграмма компонентов
Code Diagram — диаграмма кода
Это лёгкая модель для описания архитектуры, которая помогает постепенно раскрывать систему: от общего представления до деталей реализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🍾1
Windows 11 26H2: что нового этой осенью
Осенью Microsoft выпустит обновление Windows 11 26H2, которое принесёт множество улучшений во всей операционной системе.
Среди изменений — доработки меню «Пуск», изменения панели задач, более глубокие обновления поиска, улучшения Проводника и новые инструменты для повышения удобства работы.
Похоже, это будет один из самых интересных релизов Windows за последние годы.
Вот всё, что известно на данный момент
👉 @KodBlog
Осенью Microsoft выпустит обновление Windows 11 26H2, которое принесёт множество улучшений во всей операционной системе.
Среди изменений — доработки меню «Пуск», изменения панели задач, более глубокие обновления поиска, улучшения Проводника и новые инструменты для повышения удобства работы.
Похоже, это будет один из самых интересных релизов Windows за последние годы.
Вот всё, что известно на данный момент
Please open Telegram to view this post
VIEW IN TELEGRAM
Windows Central
Everything we know so far about Windows 11’s big 2026 (26H2) update arriving this fall, including changes for Start menu, Taskbar…
Here are all the Start menu, Taskbar, and Windows Search improvements coming with version 26H2.
🤣5❤1🔥1🍾1
Если тебе кажется, что для результатов
…то вот альтернатива.
Тернарный оператор — это условный оператор в C#, который во многих случаях работает как компактная версия
Для него нужны три части:
- условие;
- результат, если условие истинно;
- результат, если условие ложно.
Если условие возвращает
Тернарный оператор поддерживает target-typing и может использоваться с
При этом типы результатов должны быть совместимы: один тип должен неявно приводиться к другому либо оба значения должны приводиться к целевому типу.
Тернарный оператор помогает сократить несколько строк кода до одной.
Но если условий становится много, код быстро становится запутанным и хуже читается.
Так что держи в голове: тернарный оператор — хорошая альтернатива для простых
Для более сложной логики лучше использовать
👉 @KodBlog
true/false есть только if/else……то вот альтернатива.
Тернарный оператор — это условный оператор в C#, который во многих случаях работает как компактная версия
if/else.Для него нужны три части:
- условие;
- результат, если условие истинно;
- результат, если условие ложно.
Если условие возвращает
true, используется первое значение. Если false — второе.Тернарный оператор поддерживает target-typing и может использоваться с
var.При этом типы результатов должны быть совместимы: один тип должен неявно приводиться к другому либо оба значения должны приводиться к целевому типу.
Тернарный оператор помогает сократить несколько строк кода до одной.
Но если условий становится много, код быстро становится запутанным и хуже читается.
Так что держи в голове: тернарный оператор — хорошая альтернатива для простых
if/else.Для более сложной логики лучше использовать
switch expression.Please open Telegram to view this post
VIEW IN TELEGRAM
🤣10😁3🤯2🍾2👏1
Планировщик запросов PostgreSQL использует динамическое программирование, чтобы подобрать наиболее дешёвый порядок
Пожалуй, один из тех редких моментов, когда dynamic programming встречается не в задачке с LeetCode, а внутри системы, которой разработчики пользуются каждый день.
https://internals-for-interns.com/posts/postgres-query-planner/
👉 @KodBlog
JOIN при объединении нескольких таблиц.Пожалуй, один из тех редких моментов, когда dynamic programming встречается не в задачке с LeetCode, а внутри системы, которой разработчики пользуются каждый день.
https://internals-for-interns.com/posts/postgres-query-planner/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4⚡1🍾1
Одна из частых проблем в коде — использование чисел без понятного смысла.
Такие значения ничего не объясняют сами по себе, поэтому код становится сложнее читать, понимать и поддерживать, а вероятность ошибок растёт.
Исправить это довольно просто: вынести значение в именованную константу.
Небольшое изменение, которое делает код чище и понятнее.
👉 @KodBlog
Такие значения ничего не объясняют сами по себе, поэтому код становится сложнее читать, понимать и поддерживать, а вероятность ошибок растёт.
Исправить это довольно просто: вынести значение в именованную константу.
Небольшое изменение, которое делает код чище и понятнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤🔥3🍾2👌1
Как понять, что твоя стратегия кеширования правильная?
Ключевая метрика — процент запросов, когда данные находятся в кеше.
Это называется коэффициент попаданий в кеш и показывает, как часто ты можешь переиспользовать закешированный объект.
Вот как замаксить этот коэффициент:
I. Размер пространства ключей
Единственный способ найти элемент в кеше — точно совпасть по ключу.
Чем меньше возможных ключей, тем эффективнее кеш.
Всегда думай, как уменьшить количество возможных ключей.
II. Размер кеша и элементов
Сколько объектов ты можешь хранить в кеше, зависит от их среднего размера и размера самого кеша.
Когда кеш заполнен, приходится вытеснять старые элементы перед добавлением новых.
Это снижает коэффициент попаданий, потому что элементы удаляются даже если могли бы удовлетворить будущие запросы.
Значит, чем больше элементов помещается в кеш, тем выше будет коэффициент попаданий.
III. Долговечность
Во многих случаях можно кешировать объекты на предопределённое время, так называемый Time to Live, TTL.
В других случаях ты не можешь рисковать устаревшими данными и должен инвалидировать объекты в кеше.
В общем, чем дольше ты можешь держать элементы в кеше, тем выше шанс их переиспользовать.
Большинство кейсов, хорошо подходящих для кеширования, имеют высокий ratio чтений к записям.
Потому что закешированные элементы можно создать один раз и хранить длительное время, пока они не истекут или не станут невалидными.
С другой стороны, кейсы с частыми изменениями данных могут сделать кеш бесполезным, потому что элементы успевают устареть до следующего использования.
👉 @KodBlog
Ключевая метрика — процент запросов, когда данные находятся в кеше.
Это называется коэффициент попаданий в кеш и показывает, как часто ты можешь переиспользовать закешированный объект.
Вот как замаксить этот коэффициент:
I. Размер пространства ключей
Единственный способ найти элемент в кеше — точно совпасть по ключу.
Чем меньше возможных ключей, тем эффективнее кеш.
Всегда думай, как уменьшить количество возможных ключей.
II. Размер кеша и элементов
Сколько объектов ты можешь хранить в кеше, зависит от их среднего размера и размера самого кеша.
Когда кеш заполнен, приходится вытеснять старые элементы перед добавлением новых.
Это снижает коэффициент попаданий, потому что элементы удаляются даже если могли бы удовлетворить будущие запросы.
Значит, чем больше элементов помещается в кеш, тем выше будет коэффициент попаданий.
III. Долговечность
Во многих случаях можно кешировать объекты на предопределённое время, так называемый Time to Live, TTL.
В других случаях ты не можешь рисковать устаревшими данными и должен инвалидировать объекты в кеше.
В общем, чем дольше ты можешь держать элементы в кеше, тем выше шанс их переиспользовать.
Большинство кейсов, хорошо подходящих для кеширования, имеют высокий ratio чтений к записям.
Потому что закешированные элементы можно создать один раз и хранить длительное время, пока они не истекут или не станут невалидными.
С другой стороны, кейсы с частыми изменениями данных могут сделать кеш бесполезным, потому что элементы успевают устареть до следующего использования.
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾1
Как быстро находить узкие места в запросах EF Core:
Можно визуализировать план выполнения SQL-запроса прямо в Visual Studio и сразу увидеть, что именно стоит оптимизировать.
Для этого есть расширение EFCore.Visualizer.
Оно поддерживает SQL Server, PostgreSQL, SQLite, MySQL и Oracle.
Используется прямо во время отладки: наведите курсор на запрос EF Core — появится возможность открыть его план выполнения.
Пример на скриншоте .
👉 @KodBlog
Можно визуализировать план выполнения SQL-запроса прямо в Visual Studio и сразу увидеть, что именно стоит оптимизировать.
Для этого есть расширение EFCore.Visualizer.
Оно поддерживает SQL Server, PostgreSQL, SQLite, MySQL и Oracle.
Используется прямо во время отладки: наведите курсор на запрос EF Core — появится возможность открыть его план выполнения.
Пример на скриншоте .
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🍾4
Что вам не нужно на старте проекта:
— Kubernetes
— микросервисы
— отдельные базы для чтения и записи
Что действительно нужно:
— юнит-тесты
— CI/CD-пайплайн
— монолитная архитектура
Главный враг любого программного проекта — не нехватка времени, а недостаток простоты. Хотя, конечно, Kubernetes для трёх пользователей звучит гораздо солиднее.😔
👉 @KodBlog
— Kubernetes
— микросервисы
— отдельные базы для чтения и записи
Что действительно нужно:
— юнит-тесты
— CI/CD-пайплайн
— монолитная архитектура
Главный враг любого программного проекта — не нехватка времени, а недостаток простоты. Хотя, конечно, Kubernetes для трёх пользователей звучит гораздо солиднее.
Please open Telegram to view this post
VIEW IN TELEGRAM
💯11⚡2👍2🍾1
Надоело раскладывать проект по слоям?
Vertical Slice Architecture предлагает другой подход: код группируется по фичам, а не по горизонтальным слоям вроде Controllers, Services и Repositories.
В результате всё, что относится к конкретной фиче, находится рядом:
— выше связность кода
— проще вносить изменения
— меньше переходов между слоями и папками
— бизнес-логика не размазана по всему проекту
И есть ещё один актуальный плюс: такой подход хорошо ложится на работу с LLM и кодинг-агентами. Когда весь контекст фичи собран в одном месте, модели проще понять, что именно нужно изменить.
👉 @KodBlog
Vertical Slice Architecture предлагает другой подход: код группируется по фичам, а не по горизонтальным слоям вроде Controllers, Services и Repositories.
В результате всё, что относится к конкретной фиче, находится рядом:
— выше связность кода
— проще вносить изменения
— меньше переходов между слоями и папками
— бизнес-логика не размазана по всему проекту
И есть ещё один актуальный плюс: такой подход хорошо ложится на работу с LLM и кодинг-агентами. Когда весь контекст фичи собран в одном месте, модели проще понять, что именно нужно изменить.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🍾2🤨1
Используете ли вы человекочитаемые ID объектов?
Разберёмся, почему такой подход стоит применять в приложениях.
Начнём с выбора типа данных для идентификаторов объектов, или первичных ключей.
В реляционных базах данных часто используют целые числа: база автоматически присваивает каждой новой строке следующий порядковый номер. Это простое решение, которое хорошо подходит для небольших систем.
Однако у автоинкрементных ID есть недостаток: они делают приложение уязвимым для перебора идентификаторов. Если ID текущего объекта —
UUID устраняют эту проблему благодаря случайной генерации. Кроме того, они удобны в распределённых системах, поскольку снижают риск коллизий.
UUID также полезны, когда ID объекта необходимо сгенерировать непосредственно в коде, а не на стороне базы данных.
Но какой бы тип данных вы ни выбрали, остаётся один недостаток: сам идентификатор ничего не сообщает об объекте, которому он принадлежит.
Иначе обстоит дело с такими ID:
*
*
По префиксу можно понять, к какому типу относится объект. Например,
При этом такие ID необязательно делать первичными ключами в базе данных. Их можно генерировать в коде перед возвратом данных клиенту.
Такой формат сделает API более удобным и понятным для его потребителей.
Как вы относитесь к человекочитаемым ID объектов?
👉 @KodBlog
Разберёмся, почему такой подход стоит применять в приложениях.
Начнём с выбора типа данных для идентификаторов объектов, или первичных ключей.
В реляционных базах данных часто используют целые числа: база автоматически присваивает каждой новой строке следующий порядковый номер. Это простое решение, которое хорошо подходит для небольших систем.
Однако у автоинкрементных ID есть недостаток: они делают приложение уязвимым для перебора идентификаторов. Если ID текущего объекта —
42, злоумышленник может предположить, что следующий объект имеет ID 43. При наличии незащищённых API-эндпоинтов этим можно воспользоваться.UUID устраняют эту проблему благодаря случайной генерации. Кроме того, они удобны в распределённых системах, поскольку снижают риск коллизий.
UUID также полезны, когда ID объекта необходимо сгенерировать непосредственно в коде, а не на стороне базы данных.
Но какой бы тип данных вы ни выбрали, остаётся один недостаток: сам идентификатор ничего не сообщает об объекте, которому он принадлежит.
Иначе обстоит дело с такими ID:
*
ord_01HZW2RKF63AWC1BT901FPGRGT*
tr_afdf5738-6a8e-4d1a-90db-e894a3828320По префиксу можно понять, к какому типу относится объект. Например,
ord может означать Order — заказ, а tr — Transaction — транзакцию.При этом такие ID необязательно делать первичными ключами в базе данных. Их можно генерировать в коде перед возвратом данных клиенту.
Такой формат сделает API более удобным и понятным для его потребителей.
Как вы относитесь к человекочитаемым ID объектов?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🍾1
Если вы создаёте новый API на .NET 9 или .NET 10 и ищете привычную страницу документации, её больше нет.
Годами в стандартном шаблоне использовался Swashbuckle, а интерактивная документация появлялась сразу из коробки. Теперь всё изменилось. Фреймворк сам генерирует OpenAPI-документ, а встроенный UI больше не входит в шаблон по умолчанию.
На первый взгляд кажется, что это потеря. Но потом становится понятно, что пришло на замену. Фреймворк сам создаёт OpenAPI-спеку одним вызовом. Дальше можно подключить современный UI поверх этой спеки.
Я обычно использую Scalar: он быстрый, сразу хорошо выглядит и работает с тем же документом, который уже генерирует фреймворк.
Главное изменение — поменялось место, где находится ответственность за описание API. Теперь OpenAPI-спека принадлежит самому фреймворку, а не сторонней библиотеке UI, которую приходится накручивать поверх. Интерфейс документации становится тонким слоем, который можно заменить без изменения процесса генерации спеки.
Старый вариант всё ещё можно оставить — достаточно вручную установить нужный пакет. Но если вы всё равно обновляетесь, это хороший момент убрать одну зависимость и заодно получить более современный UI.
👉 @KodBlog
Годами в стандартном шаблоне использовался Swashbuckle, а интерактивная документация появлялась сразу из коробки. Теперь всё изменилось. Фреймворк сам генерирует OpenAPI-документ, а встроенный UI больше не входит в шаблон по умолчанию.
На первый взгляд кажется, что это потеря. Но потом становится понятно, что пришло на замену. Фреймворк сам создаёт OpenAPI-спеку одним вызовом. Дальше можно подключить современный UI поверх этой спеки.
Я обычно использую Scalar: он быстрый, сразу хорошо выглядит и работает с тем же документом, который уже генерирует фреймворк.
Главное изменение — поменялось место, где находится ответственность за описание API. Теперь OpenAPI-спека принадлежит самому фреймворку, а не сторонней библиотеке UI, которую приходится накручивать поверх. Интерфейс документации становится тонким слоем, который можно заменить без изменения процесса генерации спеки.
Старый вариант всё ещё можно оставить — достаточно вручную установить нужный пакет. Но если вы всё равно обновляетесь, это хороший момент убрать одну зависимость и заодно получить более современный UI.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🍾2
Анонсирована v2.0 официального MCP SDK для C#.
MCP C# SDK 2.0 реализует спецификацию от 28 июля 2026 года и включает:
- протокол с приоритетом на stateless-режим работы;
- стандартизированные HTTP-заголовки;
- поддержку Multi Round-Trip Requests для интерактивных инструментов.
При этом SDK сохраняет обратную совместимость с предыдущими версиями.
👉 @KodBlog
MCP C# SDK 2.0 реализует спецификацию от 28 июля 2026 года и включает:
- протокол с приоритетом на stateless-режим работы;
- стандартизированные HTTP-заголовки;
- поддержку Multi Round-Trip Requests для интерактивных инструментов.
При этом SDK сохраняет обратную совместимость с предыдущими версиями.
Please open Telegram to view this post
VIEW IN TELEGRAM
Microsoft News
Announcing v2.0 of the official MCP C# SDK
MCP C# SDK v2.0 implements the 2026-07-28 specification with a stateless-first protocol, standardized HTTP headers, and Multi Round-Trip Requests for interactive tools, all while staying backward compatible.
❤4🍾1
В C# 15 появятся
«Они заменят обходные решения для управления потоком выполнения во вложенных циклах: например, булевый флаг, который устанавливается во внутреннем цикле и затем проверяется на каждом внешнем уровне, или
👉 @KodBlog
break и continue с метками.«Они заменят обходные решения для управления потоком выполнения во вложенных циклах: например, булевый флаг, который устанавливается во внутреннем цикле и затем проверяется на каждом внешнем уровне, или
goto, перескакивающий за пределы циклов».Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤🔥6🍾5🥰1
Блог .NET: от сгенерированного кода к проверенному с помощью агента для написания юнит-тестов.
https://devblogs.microsoft.com/dotnet/polyglot-unit-testing-agent/
👉 @KodBlog
https://devblogs.microsoft.com/dotnet/polyglot-unit-testing-agent/
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾1
Middleware, но для исходящих HTTP-запросов?
Да, в ASP.NET Core такое есть.
Это похоже на middleware, только работает в обратном направлении.
Отличный сценарий использования? Добавление заголовков аутентификации в запрос.
👉 @KodBlog
Да, в ASP.NET Core такое есть.
DelegatingHandler позволяет добавлять дополнительную логику вокруг исходящих запросов.Это похоже на middleware, только работает в обратном направлении.
Отличный сценарий использования? Добавление заголовков аутентификации в запрос.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥10❤3😍2🍾1