Как выполнить на 100% безопасную проверку с отрицанием условия?
Это проще, чем кажется.
Но в чём проблема со "старым" способом?
Оператор
А это может привести к нежелательному поведению.
Зато с использованием отрицательного сопоставления с образцом (negated pattern matching) вы в безопасности.
Отрицательные шаблоны — это одна из новых возможностей, добавленных в C# за последние версии.
Они позволяют исключать определённые шаблоны с помощью ключевого слова
Иными словами, можно исключать конкретные структуры из сопоставления.
С этим ваш код становится:
> Проще для понимания
> Читаемее
Но учтите:
Значение, к которому применяется выражение сопоставления, должно быть константным.
👉 @KodBlog
Это проще, чем кажется.
Но в чём проблема со "старым" способом?
Оператор
!=
может быть переопределён.А это может привести к нежелательному поведению.
Зато с использованием отрицательного сопоставления с образцом (negated pattern matching) вы в безопасности.
Отрицательные шаблоны — это одна из новых возможностей, добавленных в C# за последние версии.
Они позволяют исключать определённые шаблоны с помощью ключевого слова
not
Иными словами, можно исключать конкретные структуры из сопоставления.
С этим ваш код становится:
> Проще для понимания
> Читаемее
Но учтите:
Значение, к которому применяется выражение сопоставления, должно быть константным.
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Какой язык более читаемый: C# или Python? Программисты забивают на безопасность?
Обсуждаем эти и другие холиварные темы в шоу Контура «Согласен — не согласен», где сталкиваются два представителя разных IT-профессий, каждый со своим мнением и бэкграундом.
Cмотрите самые горячие выпуски🔥
➡️ С# vs Python-разработчики: какой язык круче
➡️ Джун vs cеньор-разработчики: нужны ли джуны в бигтехе
➡️ Бэкендер vs фронтендер: кто больше страдает
➡️ Программист vs учитель информатики: делать ли программирование обязательным в школе
➡️ Безопасник vs программист: кто должен думать об уязвимости продукта
Новые дискуссии выходят в канале @KonturTech каждые две недели. Будет эмоционально, но с уважением.
16+. Реклама. АО «ПФ «СКБ Контур», ОГРН 1026605606620. 620144, Екатеринбург, ул. Народной Воли, 19А. Erid: 2SDnjcTtt77
Обсуждаем эти и другие холиварные темы в шоу Контура «Согласен — не согласен», где сталкиваются два представителя разных IT-профессий, каждый со своим мнением и бэкграундом.
Cмотрите самые горячие выпуски
Новые дискуссии выходят в канале @KonturTech каждые две недели. Будет эмоционально, но с уважением.
16+. Реклама. АО «ПФ «СКБ Контур», ОГРН 1026605606620. 620144, Екатеринбург, ул. Народной Воли, 19А. Erid: 2SDnjcTtt77
Please open Telegram to view this post
VIEW IN TELEGRAM
Понимание архитектуры микросервисов
Задумывались ли вы, как компании вроде Netflix и Amazon внедряют новые функции с молниеносной скоростью? Секрет может крыться в их технологическом стеке, основанном на микросервисной архитектуре.
В основе микросервисной архитектуры лежит идея разделения приложения на набор небольших, слабо связанных сервисов. Каждый сервис запускается как отдельный процесс, имеет чётко определённый API, располагается в своей кодовой базе, управляется отдельной командой и развёртывается независимо.
Ключевые компоненты микросервисной архитектуры:
1. Load Balancer (балансировщик нагрузки): равномерно распределяет входящий сетевой трафик между серверами.
2. CDN (Content Delivery Network): распределённая сеть серверов, доставляющая контент пользователю на основе его геолокации — ускоряет загрузку страниц.
3. API Gateway: маршрутизирует входящие запросы к нужному микросервису через REST API или другие протоколы.
4. Management (управление): отвечает за мониторинг и координацию микросервисов, обеспечивая их стабильную работу и взаимодействие.
5. Microservices (микросервисы): каждый сервис реализует отдельную функцию, может взаимодействовать с другими через RPC (удалённый вызов процедур) и сам отвечает за хранение данных или состояния.
Преимущества:
✅ Масштабируемость: можно масштабировать только нужные части приложения
✅ Гибкость: каждый микросервис разрабатывается, развёртывается и масштабируется независимо
✅ Устойчивость: сбой одного сервиса не выводит из строя всё приложение
✅ Быстрая доставка: небольшие кодовые базы — более быстрый выпуск новых функций
Недостатки:
❌ Сложность: больше сервисов — выше архитектурная сложность
❌ Согласованность данных: сложно поддерживать целостность данных между сервисами
❌ Сетевые задержки: взаимодействие между сервисами увеличивает время отклика
❌ Обработка ошибок: сложно отследить, где именно произошла ошибка
Микросервисная архитектура — не панацея, но мощный инструмент в арсенале современной разработки.
👉 @KodBlog
Задумывались ли вы, как компании вроде Netflix и Amazon внедряют новые функции с молниеносной скоростью? Секрет может крыться в их технологическом стеке, основанном на микросервисной архитектуре.
В основе микросервисной архитектуры лежит идея разделения приложения на набор небольших, слабо связанных сервисов. Каждый сервис запускается как отдельный процесс, имеет чётко определённый API, располагается в своей кодовой базе, управляется отдельной командой и развёртывается независимо.
Ключевые компоненты микросервисной архитектуры:
1. Load Balancer (балансировщик нагрузки): равномерно распределяет входящий сетевой трафик между серверами.
2. CDN (Content Delivery Network): распределённая сеть серверов, доставляющая контент пользователю на основе его геолокации — ускоряет загрузку страниц.
3. API Gateway: маршрутизирует входящие запросы к нужному микросервису через REST API или другие протоколы.
4. Management (управление): отвечает за мониторинг и координацию микросервисов, обеспечивая их стабильную работу и взаимодействие.
5. Microservices (микросервисы): каждый сервис реализует отдельную функцию, может взаимодействовать с другими через RPC (удалённый вызов процедур) и сам отвечает за хранение данных или состояния.
Преимущества:
Недостатки:
Микросервисная архитектура — не панацея, но мощный инструмент в арсенале современной разработки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Ты, скорее всего, пропустил это улучшение в LINQ
Теперь вместо того чтобы использовать Skip и Take для пропуска и выборки определённого количества элементов из коллекции, можно обойтись только Take.
Начиная с .NET 6, у метода Take появилась новая перегрузка, которая поддерживает ещё одну крутую фичу — диапазоны (Ranges).
А что такое диапазоны?
Они появились в C# 8 и позволяют брать подмножество коллекции с помощью оператора .., задавая начальный и конечный индексы.
Начальный индекс включается, конечный — нет. Оба индекса имеют тип Index.
Один из ключевых плюсов такого подхода — улучшенная производительность, так как под капотом процесс выборки данных может быть оптимизирован.
Но учти: если указать индекс, выходящий за пределы коллекции, будет выброшено исключение
👉 @KodBlog
Теперь вместо того чтобы использовать Skip и Take для пропуска и выборки определённого количества элементов из коллекции, можно обойтись только Take.
Начиная с .NET 6, у метода Take появилась новая перегрузка, которая поддерживает ещё одну крутую фичу — диапазоны (Ranges).
А что такое диапазоны?
Они появились в C# 8 и позволяют брать подмножество коллекции с помощью оператора .., задавая начальный и конечный индексы.
Начальный индекс включается, конечный — нет. Оба индекса имеют тип Index.
Один из ключевых плюсов такого подхода — улучшенная производительность, так как под капотом процесс выборки данных может быть оптимизирован.
Но учти: если указать индекс, выходящий за пределы коллекции, будет выброшено исключение
IndexOutOfRangeException
Please open Telegram to view this post
VIEW IN TELEGRAM
Visual Studio теперь отображает возвращаемые значения методов прямо в коде
Фича появилась в версии 17.12 (выпущена в ноябре).
Я всегда считал, что временные переменные помогают снизить когнитивную нагрузку при работе с возвратами методов, но, похоже, теперь игра изменилась
👉 @KodBlog
Фича появилась в версии 17.12 (выпущена в ноябре).
Я всегда считал, что временные переменные помогают снизить когнитивную нагрузку при работе с возвратами методов, но, похоже, теперь игра изменилась
Please open Telegram to view this post
VIEW IN TELEGRAM
Как сделать настройки приложения строго типизированными?
Рекомендуемый способ — использовать паттерн Options.
Он обеспечивает строго типизированный доступ к конфигурации приложения.
В .NET паттерн Options реализован через три интерфейса:
>
>
>
Чтобы создать строго типизированную конфигурацию, можно использовать классы или record-типы.
❗️ Нельзя использовать позиционные record-типы — нужен конструктор без параметров, обязательный для десериализации конфигурации.
Преимущества использования record-типов:
> Иммутабельность
> Читаемость
> Сравнение по значению (value equality)
Вы можете просто зарегистрировать тип в DI-контейнере и использовать его там, где нужно.
Реализация — простая, а преимущества очевидны:
> Строгая типизация конфигурации
> Разделение ответственности
> Централизация и согласованность
Этого достаточно, чтобы начать использовать подход в продакшн-проектах
👉 @KodBlog
Рекомендуемый способ — использовать паттерн Options.
Он обеспечивает строго типизированный доступ к конфигурации приложения.
В .NET паттерн Options реализован через три интерфейса:
>
IOptions<T>
— доступ к строго типизированным параметрам>
IOptionsSnapshot<T>
— доступ к значениям конфигурации на момент запроса>
IOptionsMonitor<T>
— доступ к текущим значениям и возможность подписки на измененияЧтобы создать строго типизированную конфигурацию, можно использовать классы или record-типы.
Преимущества использования record-типов:
> Иммутабельность
> Читаемость
> Сравнение по значению (value equality)
Вы можете просто зарегистрировать тип в DI-контейнере и использовать его там, где нужно.
Реализация — простая, а преимущества очевидны:
> Строгая типизация конфигурации
> Разделение ответственности
> Централизация и согласованность
Этого достаточно, чтобы начать использовать подход в продакшн-проектах
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Самое раздражающее при отладке C#-кода?
(что может серьёзно замедлить процесс)
Проверка значений в коллекции.
Приходится разворачивать каждый элемент, чтобы посмотреть значения свойств.
Чтобы решить эту проблему, в Visual Studio недавно появилась функция закрепляемых свойств (pinnable properties).
Она позволяет быстро отслеживать нужные свойства.
Чтобы воспользоваться, наведите курсор на свойство и нажмите на иконку закрепления.
См. видео-пример, как это использовать🕵️♀️
👉 @KodBlog
(что может серьёзно замедлить процесс)
Приходится разворачивать каждый элемент, чтобы посмотреть значения свойств.
Чтобы решить эту проблему, в Visual Studio недавно появилась функция закрепляемых свойств (pinnable properties).
Она позволяет быстро отслеживать нужные свойства.
Чтобы воспользоваться, наведите курсор на свойство и нажмите на иконку закрепления.
См. видео-пример, как это использовать
Please open Telegram to view this post
VIEW IN TELEGRAM
Как сделать систему масштабируемой?
Современные приложения должны справляться с резкими всплесками трафика без сбоев.
Когда один сервер достигает предела, это чревато задержками, ошибками или полной недоступностью.
Есть два основных подхода:
> Вертикальное масштабирование → увеличение ресурсов одного сервера
> Горизонтальное масштабирование → добавление серверов за балансировщиком нагрузки
Для горизонтального масштабирования отличным выбором является YARP — высокопроизводительный обратный прокси от Microsoft для .NET.
В моих тестах с K6 масштабирование до 5 экземпляров API дало прирост:
✅ Время отклика: с 9.68 мс до 4.65 мс
✅ Пропускная способность: с 2260 RPS до 3881 RPS
Настроить YARP и запустить масштабирование можно за считанные минуты.
👉 Подробности: read
👉 @KodBlog
Современные приложения должны справляться с резкими всплесками трафика без сбоев.
Когда один сервер достигает предела, это чревато задержками, ошибками или полной недоступностью.
Есть два основных подхода:
> Вертикальное масштабирование → увеличение ресурсов одного сервера
> Горизонтальное масштабирование → добавление серверов за балансировщиком нагрузки
Для горизонтального масштабирования отличным выбором является YARP — высокопроизводительный обратный прокси от Microsoft для .NET.
В моих тестах с K6 масштабирование до 5 экземпляров API дало прирост:
Настроить YARP и запустить масштабирование можно за считанные минуты.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Событийно-ориентированные фоновые задачи в C#
BackgroundWorker — это легковесный инструмент для выполнения асинхронной работы.
Обмен сообщениями между хостом и рабочим происходит через события.
Есть встроенная поддержка отмены задач и обновлений прогресса.
LINQPad визуализирует весь процесс :
вызвал
Хочешь, стилизуй вывод с помощью CSS.
👉 Полный скрипт для загрузки доступен по ссылке: https://share.linqpad.net/phkul63s.linq
👉 @KodBlog
BackgroundWorker — это легковесный инструмент для выполнения асинхронной работы.
Обмен сообщениями между хостом и рабочим происходит через события.
Есть встроенная поддержка отмены задач и обновлений прогресса.
LINQPad визуализирует весь процесс :
вызвал
Dump()
— и данные сразу в окне Results как HTML.Хочешь, стилизуй вывод с помощью CSS.
Please open Telegram to view this post
VIEW IN TELEGRAM
#1 ошибка, которую я вижу у .NET-разработчиков — это повсеместное использование null.
Ссылки на null стали причиной множества багов, уязвимостей и сбоев систем.
Вот 4 способа минимизировать использование null в C#:
1. Возвращайте пустое значение из метода
> если возможно, возвращайте пустой список вместо null
> например, используйте
2. Исключайте null с помощью nullable reference types
> представлены в C# 8.0
> заставляют вас явно учитывать возможность null
3. Используйте паттерн Null Object
> объект, реализующий поведение “ничего не делать”
> позволяет избежать проверок на null
4. Используйте оператор null-условия (?.)
> безопасно обращается к свойствам объектов
> если экземпляр равен null, всё выражение вернёт null
Хотите сократить количество сбоев? Попробуйте эти подходы.👀
👉 @KodBlog
Ссылки на null стали причиной множества багов, уязвимостей и сбоев систем.
Вот 4 способа минимизировать использование null в C#:
1. Возвращайте пустое значение из метода
> если возможно, возвращайте пустой список вместо null
> например, используйте
Enumerable.Empty<TResult>()
2. Исключайте null с помощью nullable reference types
> представлены в C# 8.0
> заставляют вас явно учитывать возможность null
3. Используйте паттерн Null Object
> объект, реализующий поведение “ничего не делать”
> позволяет избежать проверок на null
4. Используйте оператор null-условия (?.)
> безопасно обращается к свойствам объектов
> если экземпляр равен null, всё выражение вернёт null
Хотите сократить количество сбоев? Попробуйте эти подходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример использования паттерна IOptions в ASP dotnet
На втором примере эквивалент с использованием
А ты используешь этот паттерн?👀
👉 @KodBlog
IOptions<T>
обеспечивает безопасность на этапе компиляции и устраняет использование магических строк.На втором примере эквивалент с использованием
IConfiguration
вместо IOptions
А ты используешь этот паттерн?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Записи действительно являются неизменяемыми.
Если вы знаете, как их определять.
Если запись объявлена традиционным способом, нет ограничений на использование обычного сеттера, что позволяет изменять объект после инициализации.
Однако, если в записи используется init только для части свойств, то такая запись не является полностью неизменяемой.
Так как же сделать их неизменяемыми?
Используйте позиционные записи.
Такой тип записей компилятор генерирует со свойствами только для инициализации (init-only).
Может показаться, что первый и второй вариант определения идентичны.
Но позвольте развеять это заблуждение.
Первая форма компилируется во вторую, и во втором случае вы можете заменить🐸
👉 @KodBlog
Если вы знаете, как их определять.
Если запись объявлена традиционным способом, нет ограничений на использование обычного сеттера, что позволяет изменять объект после инициализации.
Однако, если в записи используется init только для части свойств, то такая запись не является полностью неизменяемой.
Так как же сделать их неизменяемыми?
Используйте позиционные записи.
Такой тип записей компилятор генерирует со свойствами только для инициализации (init-only).
Может показаться, что первый и второй вариант определения идентичны.
Но позвольте развеять это заблуждение.
Первая форма компилируется во вторую, и во втором случае вы можете заменить
init
на set
и тем самым нарушить основную характеристику записей. Please open Telegram to view this post
VIEW IN TELEGRAM
MongoDB теперь нативно доступен на Azure.
Больше никаких "костылей" между сервисами.
Теперь можно:
> Запускать MongoDB Atlas напрямую из Azure Portal
> Интегрироваться с Azure AI, Databricks, OpenAI — в одном потоке
> Получать единый биллинг по всему стеку
Это будущее cloud-native разработки?
Или тесная интеграция с облаком — палка о двух концах для свободы разработчиков?
Полная разбивка: https://fnf.dev/4n1fsLd✌️
👉 @KodBlog
Больше никаких "костылей" между сервисами.
Теперь можно:
> Запускать MongoDB Atlas напрямую из Azure Portal
> Интегрироваться с Azure AI, Databricks, OpenAI — в одном потоке
> Получать единый биллинг по всему стеку
Это будущее cloud-native разработки?
Или тесная интеграция с облаком — палка о двух концах для свободы разработчиков?
Полная разбивка: https://fnf.dev/4n1fsLd
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Сократил время выполнения SQL-запроса с 70 мс до 1 мс.
Без изменений в коде. Без кэширования. Просто добавил filtered index (фильтрованный индекс).
Фильтрованные индексы — одна из самых недооценённых возможностей SQL.
Они позволяют индексировать только подмножество строк, соответствующих определённому условию — идеально подходят для флагов вроде
Но есть нюанс: если условие выполняется для большинства строк, индекс не даст прироста производительности.
Эта оптимизация дала огромный прирост в одном из проектов.
В статье подробно разбирается реализацию и показывается, как это использовать: читать
👉 @KodBlog
Без изменений в коде. Без кэширования. Просто добавил filtered index (фильтрованный индекс).
Фильтрованные индексы — одна из самых недооценённых возможностей SQL.
Они позволяют индексировать только подмножество строк, соответствующих определённому условию — идеально подходят для флагов вроде
ProcessedAt IS NULL
.Но есть нюанс: если условие выполняется для большинства строк, индекс не даст прироста производительности.
Эта оптимизация дала огромный прирост в одном из проектов.
В статье подробно разбирается реализацию и показывается, как это использовать: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
В EF Core 9 улучшена функция
Небольшое, но полезное улучшение.
Эта возможность появилась в EF Core 8 — для производительного обновления данных в базе без загрузки в память.
Однако изначально она поддерживала только примитивные типы.
Если нужно было обновить комплексный тип, приходилось вручную перечислять все его свойства… до выхода EF Core 9.
Теперь комплексные типы полностью поддерживаются — больше не нужно делать это вручную🙂
👉 @KodBlog
ExecuteUpdate
Небольшое, но полезное улучшение.
Эта возможность появилась в EF Core 8 — для производительного обновления данных в базе без загрузки в память.
Однако изначально она поддерживала только примитивные типы.
Если нужно было обновить комплексный тип, приходилось вручную перечислять все его свойства… до выхода EF Core 9.
Теперь комплексные типы полностью поддерживаются — больше не нужно делать это вручную
Please open Telegram to view this post
VIEW IN TELEGRAM
Rider 2025.2 EAP 4 уже тут
Этот билд приносит поддержку SQL-проектов базы данных через встроенный плагин — без доп. настройки:
> Шаблоны SQL-проектов в стиле SDK
> Сравнение схем и публикация проекта
> Импорт из БД, добавление ссылок и другое
Подробнее > jetbrains.com/rider/nextversion🐸
👉 @KodBlog
Этот билд приносит поддержку SQL-проектов базы данных через встроенный плагин — без доп. настройки:
> Шаблоны SQL-проектов в стиле SDK
> Сравнение схем и публикация проекта
> Импорт из БД, добавление ссылок и другое
Подробнее > jetbrains.com/rider/nextversion
Please open Telegram to view this post
VIEW IN TELEGRAM
Улучшения производительности
👉 @KodBlog
FrozenDictionary
с целочисленными (int
) ключами в .NET 10FrozenDictionary
представляют собой коллекции, оптимизированные для чтения (Dictionary
и Set
), создание которых занимает больше времени, но чтение из них происходит быстрее по сравнению с неизменяемыми (immutable
) коллекциями.Please open Telegram to view this post
VIEW IN TELEGRAM