tgindex

C# Portal | Программирование

описание

Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика Сотрудничество, реклама: @devmangx Менеджер: @Spiral_Yuri РКН: https://clck.ru/3FocB6

13 302
подписчиков

Лучшие посты

за три месяца
  • 17 июл.1 892 просмотров12 реакций9 пересылок

    без подписи

  • 17 июн.1 889 просмотров1 реакций10 пересылок

    без подписи

  • 4 авг.1 884 просмотров8 реакций11 пересылок

    C# 15: примеры использования именованных break и continue до и после изменений. После анонса вокруг этой возможности разгорелось немало споров. Главный аргумент критиков — для выхода из вложенных циклов уже есть goto. На практике же разработчикам обычно приходится выбирать между goto и дополнительными переменными для отслеживания состояния. На мой взгляд, именованные break и continue передают намерение кода заметно яснее, а примеры выше это хорошо показывают. 👉 @KodBlog

  • 8 авг.1 841 просмотров5 реакций32 пересылок

    Как контролировать соблюдение архитектурных правил в проекте? Возможности компилятора C# здесь довольно ограничены, а проверять всё вручную на код-ревью дорого. Есть промежуточный вариант, который я использую в своих проектах — архитектурные тесты. Это автоматические тесты, которые проверяют структуру и устройство кода. С их помощью можно задавать архитектурные правила прямо на C#: * контролировать направление зависимостей между проектами; * задавать правила именования классов; * требовать, чтобы классы были sealed. 👉 @KodBlog

  • 15 июл.1 801 просмотров7 реакций2 пересылок

    без подписи

  • 5 авг.1 786 просмотров10 реакций8 пересылок

    В .NET 11 появилось множество изменений в JIT (они также применяются к Native AOT), которые устраняют избыточные проверки границ массива. Цель — сделать безопасный код таким же быстрым, как и unsafe. Эти изменения можно отслеживать по метке reduce-unsafe. Один из примеров улучшений — по ссылке ниже. https://github.com/EgorBot/Benchmarks/issues/169 #dotnet 👉 @KodBlog

  • 4 авг.1 782 просмотров11 пересылок

    без подписи

  • 6 авг.1 709 просмотров15 реакций8 пересылок

    Что предпочитаете? 😂 ForLoop (1) или GotoLoop (2) #dotnet 👉 @KodBlog

  • 4 авг.1 700 просмотров1 реакций3 пересылок

    Агенты Copilot Studio получили полноценные корпоративные идентификаторы. Теперь каждому новому агенту автоматически выдаётся собственный Microsoft Entra Agent ID. Отключить это нельзя. После публикации агента разрешения поддерживаемых коннекторов Power Platform отображаются прямо в его профиле в Entra. Администраторы могут: Видеть, к каким сервисам настроено обращение агента Проверять историю входов Управлять его жизненным циклом Настраивать доступ к коннекторам через Conditional Access DLP и Advanced Connector Policies по-прежнему контролируют доступ во время выполнения. Теперь у агента есть собственный идентификатор, назначенный ответственный, видимые разрешения, журналы и политики. Именно такой уровень управления был нужен корпоративным агентам. Пока есть одно ограничение: сквозное применение Conditional Access по Agent ID к вызовам коннекторов сейчас работает только в Teams. При этом разрешения видны во всех каналах. Microsoft готовит серьёзные вещи. 👉 @KodBlog

  • 7 авг.1 693 просмотров1 реакций14 пересылок

    Что такое breaking change для API? Вот несколько примеров: > Удаление или переименование API-методов или параметров API. > Изменение поведения существующих API. > Изменение кодов ошибок API. Breaking change означает, что вам нужно версионировать API — иначе вы рискуете сломать существующих потребителей API. К счастью, ASP.NET Core упрощает добавление версионирования API. И ещё немного спорное мнение: версионирование API должно быть крайней мерой. 👉 @KodBlog

  • 5 авг.1 683 просмотров15 реакций11 пересылок

    А вы знали? Теперь в C# есть ключевое слово safe 🙃 Оно обязательно для всех P/Invoke-объявлений и полей в структурах с explicit или extended layout. Нужно явно указать либо safe, либо unsafe — если не указать модификатор, код не скомпилируется. 👉 @KodBlog

  • 6 авг.1 683 просмотров6 реакций6 пересылок

    Интересный эксперимент: windows-csharp https://github.com/microsoft/windows-rs/pull/4777 Генератор C#, который строит проекции Windows API из метаданных Windows, но вместо обёрток CsWinRT генерирует прямые вызовы COM/ABI. Без WinRT.Runtime.dll и без SDK projections. Это пока не полноценная замена (?), но уже работает с реальными приложениями на базе Composition/WinUI. 🤔 👉 @KodBlog

  • 8 авг.1 654 просмотров10 реакций12 пересылок

    Новое в .NET 11: Сжатие HTTP-запросов с помощью GZip, Brotli и Zstandard. 👉 @KodBlog

  • 9 авг.1 632 просмотров27 реакций15 пересылок

    C# 15 позволяет объявить тип, который может быть только одним из заранее заданного набора других типов. Union types. Новое ключевое слово, одна строка, базовый класс не нужен. public record class Cat(string Name); public record class Dog(string Name); public record class Bird(string Name); public union Pet(Cat, Dog, Bird); Теперь Pet может содержать Cat, Dog или Bird — и ничего больше. Pet pet = new Dog("Rex"); string name = pet switch { Dog d => d.Name, Cat c => c.Name, Bird b => b.Name, }; ✔️ Неявное преобразование каждого из допустимых типов напрямую в union ✔️ Компилятор заставляет switch обработать все варианты — пропустите один, и проект не соберётся ✔️ Не нужна иерархия наследования, класс-обёртка или ручные проверки в духе «это Cat или Dog» Пока это предварительная функция в .NET 11, поэтому синтаксис ещё может измениться до релиза. Но попробовать уже сейчас вполне можно, если хотите заранее разобраться с новой возможностью. 👉 @KodBlog

  • 7 авг.1 625 просмотров8 реакций5 пересылок

    Знали ли вы, что обмен сообщениями можно использовать по схеме request–response? Один сервис — отправитель запроса — посылает сообщение с запросом и ожидает соответствующее ответное сообщение. Со стороны отправителя это выглядит как синхронное взаимодействие. Вот как выглядит такой поток. Плюсы: Слабая связанность ✅ Прозрачность расположения сервисов ✅ Минусы: Высокая задержка ❌ Дополнительная сложность реализации ❌ Я реализовывал такой подход с RabbitMQ и NATS — в обоих случаях он отлично себя показал. 👉 @KodBlog

  • 9 авг.1 625 просмотров4 реакций15 пересылок

    О правилах Clean Architecture спорят много. Но по-настоящему важно только одно. Зависимости направлены внутрь. Посмотрите на схему. Web.Api находится снаружи. Затем Infrastructure. Затем Application. В центре — Domain, и он ничего не знает ни об одном из этих слоёв. В вашем Domain нет зависимостей от базы данных, веб-фреймворка или сервиса отправки почты. Там только бизнес-правила на обычном C#. Что это даёт: * Можно заменить Postgres на что-то другое, не меняя Domain. Хотя лучше не надо. * Можно тестировать бизнес-правила вообще без базы данных — быстрыми юнит-тестами, которые могут написать ваши агенты. * Новый разработчик может разобраться в ядре приложения, не изучая весь стек. Понять это правило легко. Намного сложнее не нарушить его спустя шесть месяцев дедлайнов. Поэтому в моём шаблоне есть архитектурные тесты, которые валят сборку в тот момент, когда внутренний слой нарушает это правило. 👉 @KodBlog

  • 10 авг.1 611 просмотров15 реакций17 пересылок

    Пробовали IExceptionHandler в .NET 10? Это более простой способ глобально обрабатывать исключения. IExceptionHandler встроен в стандартный middleware обработки ошибок. Можно обрабатывать либо все исключения, либо только конкретные типы. А значит, обработчики можно выстраивать в цепочку. 👉 @KodBlog

  • 10 авг.1 608 просмотров14 реакций11 пересылок

    без подписи

  • 11 авг.1 605 просмотров8 реакций20 пересылок

    Если достаточно долго работать с базами данных, рано или поздно столкнёшься с проблемами подключений или параллелизма. В такой ситуации не стоит просто повышать лимиты в конфигурации. Лучше разобраться в архитектуре, чтобы понимать, почему это происходит и как исправить проблему оптимальным способом. Эта статья от гениального человека — отличный разбор управления подключениями в Postgres и возможных решений. Легко свести всё к особенностям Postgres с отдельным процессом на каждое соединение, но похожие проблемы могут возникать и в других базах данных, включая MySQL. Часто ответ кроется в пуле подключений, но и он добавляет свою сложность, которую тоже важно понимать. Статье уже 8 лет, но для Postgres она остаётся актуальной и в 2026 году. Ссылка ниже. https://brandur.org/postgres-connections 👉 @KodBlog

  • 12 авг.1 586 просмотров22 реакций11 пересылок

    C# 12 убрал приличный кусок шаблонного кода, который вы пишете почти в каждом сервисном классе. Если вы до сих пор для каждой зависимости объявляете поле, параметр конструктора и потом отдельно присваиваете одно другому, то пишете три строки там, где теперь нужна одна. Возьмём обычный OrderService. Три readonly-поля. Конструктор с тремя параметрами. Ещё три строки внутри конструктора, где каждый параметр присваивается своему полю. Получается 13 строк, и почти все они нужны только для прокидывания зависимостей. С первичным конструктором та же версия занимает около шести строк. Вы просто указываете зависимости прямо в объявлении класса: OrderService получает IOrderRepo repo, ILogger и IEmailSender email. После этого repo, logger и email можно напрямую использовать в методах. Поведение то же, шаблонного кода почти нет. Перед тем как переписывать всё подряд, стоит помнить три вещи. Больше не нужно повторять каждую зависимость по три раза. Объявляете её один раз — в заголовке класса. Параметры первичного конструктора доступны во всём классе, а не только внутри конструктора, поэтому к ним можно обращаться из любых методов. Тестируемость при этом никуда не исчезает. Моки внедряются точно так же, как раньше. Есть один нюанс, который может сэкономить вам час: параметры первичного конструктора не становятся полями автоматически. Если вам действительно нужно сохранить параметр именно как поле, сделайте это явно. Не додумывайте за компилятор — он сам подскажет. Попробуйте сегодня открыть один сервисный класс и перевести его на первичный конструктор. Посчитайте строки до и после. Разница — это тот шаблонный код, который вам больше не придётся писать. 👉 @KodBlog