C# Portal | Программирование
13.9K subscribers
610 photos
79 videos
18 files
605 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
Как выполнить на 100% безопасную проверку с отрицанием условия?

Это проще, чем кажется.

Но в чём проблема со "старым" способом?

Оператор != может быть переопределён.

А это может привести к нежелательному поведению.

Зато с использованием отрицательного сопоставления с образцом (negated pattern matching) вы в безопасности.

Отрицательные шаблоны — это одна из новых возможностей, добавленных в C# за последние версии.

Они позволяют исключать определённые шаблоны с помощью ключевого слова not

Иными словами, можно исключать конкретные структуры из сопоставления.

С этим ваш код становится:

> Проще для понимания
> Читаемее

Но учтите:


Значение, к которому применяется выражение сопоставления, должно быть константным.

👉 @KodBlog
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
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Ты, скорее всего, пропустил это улучшение в LINQ

Теперь вместо того чтобы использовать Skip и Take для пропуска и выборки определённого количества элементов из коллекции, можно обойтись только Take.

Начиная с .NET 6, у метода Take появилась новая перегрузка, которая поддерживает ещё одну крутую фичу — диапазоны (Ranges).

А что такое диапазоны?

Они появились в C# 8 и позволяют брать подмножество коллекции с помощью оператора .., задавая начальный и конечный индексы.

Начальный индекс включается, конечный — нет. Оба индекса имеют тип Index.

Один из ключевых плюсов такого подхода — улучшенная производительность, так как под капотом процесс выборки данных может быть оптимизирован.

Но учти: если указать индекс, выходящий за пределы коллекции, будет выброшено исключение IndexOutOfRangeException

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Visual Studio теперь отображает возвращаемые значения методов прямо в коде

Фича появилась в версии 17.12 (выпущена в ноябре).

Я всегда считал, что временные переменные помогают снизить когнитивную нагрузку при работе с возвратами методов, но, похоже, теперь игра изменилась

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Как сделать настройки приложения строго типизированными?

Рекомендуемый способ — использовать паттерн Options.

Он обеспечивает строго типизированный доступ к конфигурации приложения.

В .NET паттерн Options реализован через три интерфейса:

> IOptions<T> — доступ к строго типизированным параметрам
> IOptionsSnapshot<T> — доступ к значениям конфигурации на момент запроса
> IOptionsMonitor<T> — доступ к текущим значениям и возможность подписки на изменения

Чтобы создать строго типизированную конфигурацию, можно использовать классы или record-типы.

❗️Нельзя использовать позиционные record-типы — нужен конструктор без параметров, обязательный для десериализации конфигурации.

Преимущества использования record-типов:

> Иммутабельность
> Читаемость
> Сравнение по значению (value equality)

Вы можете просто зарегистрировать тип в DI-контейнере и использовать его там, где нужно.

Реализация — простая, а преимущества очевидны:

> Строгая типизация конфигурации

> Разделение ответственности

> Централизация и согласованность

Этого достаточно, чтобы начать использовать подход в продакшн-проектах

👉 @KodBlog
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
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
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Событийно-ориентированные фоновые задачи в C#

BackgroundWorker — это легковесный инструмент для выполнения асинхронной работы.

Обмен сообщениями между хостом и рабочим происходит через события.

Есть встроенная поддержка отмены задач и обновлений прогресса.

LINQPad визуализирует весь процесс :

вызвал Dump() — и данные сразу в окне Results как HTML.

Хочешь, стилизуй вывод с помощью CSS.

👉 Полный скрипт для загрузки доступен по ссылке: https://share.linqpad.net/phkul63s.linq

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
#1 ошибка, которую я вижу у .NET-разработчиков — это повсеместное использование null.

Ссылки на 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

Хотите сократить количество сбоев? Попробуйте эти подходы. 👀

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример использования паттерна IOptions в ASP dotnet

IOptions<T> обеспечивает безопасность на этапе компиляции и устраняет использование магических строк.

На втором примере эквивалент с использованием IConfiguration вместо IOptions

А ты используешь этот паттерн? 👀

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Записи действительно являются неизменяемыми.

Если вы знаете, как их определять.

Если запись объявлена традиционным способом, нет ограничений на использование обычного сеттера, что позволяет изменять объект после инициализации.

Однако, если в записи используется init только для части свойств, то такая запись не является полностью неизменяемой.

Так как же сделать их неизменяемыми?

Используйте позиционные записи.

Такой тип записей компилятор генерирует со свойствами только для инициализации (init-only).

Может показаться, что первый и второй вариант определения идентичны.

Но позвольте развеять это заблуждение.

Первая форма компилируется во вторую, и во втором случае вы можете заменить init на set и тем самым нарушить основную характеристику записей. 🐸

👉 @KodBlog
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
Please open Telegram to view this post
VIEW IN TELEGRAM
На небе и на земле только C# достоин почитания 😇

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Сократил время выполнения SQL-запроса с 70 мс до 1 мс.

Без изменений в коде. Без кэширования. Просто добавил filtered index (фильтрованный индекс).

Фильтрованные индексы — одна из самых недооценённых возможностей SQL.

Они позволяют индексировать только подмножество строк, соответствующих определённому условию — идеально подходят для флагов вроде ProcessedAt IS NULL.

Но есть нюанс: если условие выполняется для большинства строк, индекс не даст прироста производительности.

Эта оптимизация дала огромный прирост в одном из проектов.

В статье подробно разбирается реализацию и показывается, как это использовать: читать

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
В EF Core 9 улучшена функция ExecuteUpdate

Небольшое, но полезное улучшение.

Эта возможность появилась в EF Core 8 — для производительного обновления данных в базе без загрузки в память.

Однако изначально она поддерживала только примитивные типы.

Если нужно было обновить комплексный тип, приходилось вручную перечислять все его свойства… до выхода EF Core 9.

Теперь комплексные типы полностью поддерживаются — больше не нужно делать это вручную 🙂

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Rider 2025.2 EAP 4 уже тут

Этот билд приносит поддержку SQL-проектов базы данных через встроенный плагин — без доп. настройки:

> Шаблоны SQL-проектов в стиле SDK
> Сравнение схем и публикация проекта
> Импорт из БД, добавление ссылок и другое

Подробнее > jetbrains.com/rider/nextversion 🐸

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Улучшения производительности FrozenDictionary с целочисленными (int) ключами в .NET 10

FrozenDictionary представляют собой коллекции, оптимизированные для чтения (Dictionary и Set), создание которых занимает больше времени, но чтение из них происходит быстрее по сравнению с неизменяемыми (immutable) коллекциями.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM