За 2023 год разработчиками PVS-Studio было написано немало статей о проверке Open Source C#-проектов. По традиции мы делимся с вами 10-ю самыми интересными ошибками, найденными за этот год. Приятного чтения!
.NET *
Хаб со знаниями про .NET
.NET CLI — Зачем загружать все родительские сборки при загрузке сборки
В CLR есть особенность, что при загрузки сборки через Assembly.Load
или через Assembly.ReflectionOnlyLoad
, загружаются все сборки по мере запроса. В отличии от констант и их типов, они заранее копируются в дочернюю сборку и больше не зависят от родительской сборки. Но в определённых случаях типы констант не копируются в дочернюю сборку и их изменение может сломать работу приложения, несмотря на то, что тип константы не должен этого делать. Эта статья Вам поможет разобраться в каких случаях это может произойти и почему так происходит.
Алгоритмы балансировки нагрузки в .NET. Кэширование и Rate Limiting в Ocelot, сравниваем со стандартными средствами .NET
Когда растет количество запросов на сервис, так что один сервер перестает справляться, возникает необходимость в горизонтальном масштабировании сервиса на нескольких серверах, и настройки балансировки нагрузки, который будет распределять запросы между ними.
Сегодня мы реализуем различные алгоритмы балансировки нагрузок в .NET, и обсудим преимущества и недостатки каждого из них.
Как на самом деле Async/Await работают в C#. Часть 1. Проблемы модели асинхронного программирования (APM)
Это перевод первой главы из поста How Async/Await Really Works in C#
Этот пост .Net блога является продолжением исходного поста, глубоко погружающим в историю, приведшую к созданию конструкций async/await и стоящие за этим дизайнерские решения и детали реализации async/await в C# и .NET.
Исходный пост What is .NET, and why should you choose it? предоставляет обзор платформы на высоком-уровне, перечисляя различные компоненты и решения на уровне дизайна, и предваряя последующие посты в глубину обозначенных тем.
Ссылки в развитие темы:
1. Часть 2 Артефакты от EAP шаблона, SynchronizationContext
2. Уроки по асинхронному программированию из первой половины работы
3. Параллельные вычисления — Все дело в контексте-синхронизации (SynchronizationContext)
4. Async/Await из C#. Головоломка для разработчиков компилятора и для нас
Истории
MIDI → Метр → MIDI
Статья поведёт нас через границу, где сходятся MIDI и метрическое время. В этом путешествии мы откроем брошюру по Международной системе единиц СИ, повстречаем файлы с более чем 6000 изменений темпа, столкнёмся с ошибками округления и напишем немного кода. Звучит заманчиво? Тогда добро пожаловать!
Разворачиваем и заворачиваем в docker проект ASP.NET core на Ubuntu в связке с PostgreSQL
На просторах интернета заметил, что довольно мало статьей про ASP.NET под Linux. К сожалению, новички вроде меня копаются часами в поисках нужной информации, поэтому в этой статье мы вместе развернём минимальное приложение ASP.NET core под Linux в среде Ubuntu и в связке с PostgreSQL и с котиками на сервере nginx, а также упакуем всё в docker контейнеры. В ходе этой статьи мы разберём некоторые консольные команды для ежедневного пользования.
Когда-либо давал. F#-сервер из скрипта на примере локального брокера сообщений
В ходе разработки на F# поднимать локальные web-серверы приходится гораздо чаще, чем это принято на C#. Связано это с большим количеством нехарактерных для C# активностей. То, что в C# делают плагины для IDE, у нас делают скрипты, причём их сферы ответственности пересекаются где-то наполовину. Если не понимать этого аспекта, то можно навечно увязнуть в ситуации перманентного нытья о недостаточной поддержке F# со стороны MS.
В этой статье я расскажу про устойчивую комбинацию из Suave
, Fable.Remoting
и Hopac
, которая может стать для вас молотком универсальным решением для реализации локальных служебных серверов.
Как стоит и как не стоит использовать HttpClient в .NET
Всем привет! Меня зовут Андрей Федотов, я бэкенд-разработчик в одной из команд платформы интернета вещей ZIIoT Oil&Gas. В этой статье я рассказываю, что нужно знать и как работать с HttpClient в .NET, чтобы не получить трудноподдерживаемый и сложный код и не нарваться на глобальный рефакторинг.
Оптимизация DevOps: Как персональные стенды и Grafana улучшают разработку и мониторинг
Всем привет, меня зовут Зуев Алексей, и я работаю DevOps-инженером в компании Bimeister! Сегодня я расскажу вам о том, как мы облегчаем жизнь нашим разработчикам и как разработчик может отследить состояние своего микросервиса в namespace Kubernetes. Основная цель этой статьи - описать, как мы пришли к дашборду для персональных стендов разработчиков.
Пример для иллюстрации принципов SOLID который я (кажется) понял
Это перевод вступления из электронной книги - документа.
Авторы утверждают что:
В этой главе вы увидите, как можно удовлетворить некоторые из распространенных требований корпоративных приложений (приложений для бизнеса), таких как низкая стоимость (простота) сопровождения и тестируемость, применяя слабосвязанный дизайн для вашего приложения. Вы увидите очень простую иллюстрацию этого подхода в примерах кода, которые показывают два разных способа реализации зависимости между классами ManagementController и TenantStore. Вы также увидите, как принципы объектно-ориентированного программирования SOLID связаны с теми же проблемами (имеются ввиду проблемы стоимости сопровождения = исправления ошибок + возможности расширения функциональности и тестируемости).
1000 и 1 способ инициализации типов в C# 12.0
Среди нововведений C# 12 было достаточно больше количество по-настоящему качественных и крутых фич (например дефолтные параметры лямбд).
Но речь сегодня пойдет о ложке дёгтя в бочке мёда - Primary Constructors.
Вот казалось бы, как здесь можно было напортачить? Идея взята прямиком из Kotlin, все что надо было сделать это перенести известную, успешно работающую функциональность из одного языка в другой. Всё.
Как говорится, воруй как художник? Думаю, что это не про Primary Constructors, потому что насколько плохо своровать фичу это надо было постараться.
Почему же в Kotlin эта фича имеет смысл, а в C# нет? Давайте разбираться.
Недооцененный паттерн «Спецификация» в связке с паттерном «Репозиторий»
Использование спецификации открыло для меня новый мир в создании приложений.
Репозитории предоставляют удобное решение для доступа к данным.
Однако за многолетний опыт разработки, побывав в нескольких компаниях, сменив кучу проектов я НЕ ВСТРЕЧАЛ паттерн "Спецификация" совместно с паттерном "Репозиторий".
Операция Lahat: новая группа Hellhounds атакует российские организации через системы на базе Linux
В октябре 2023 года команда Positive Technologies по расследованию инцидентов PT CSIRT обнаружила компрометацию одной энергетической компании с использованием трояна Decoy Dog. Этот вредонос активно используется в атаках на российские компании и правительственные организации по меньшей мере с сентября 2022 года. Однако образец, обнаруженный нами на хосте жертвы, представлял собой новую модификацию троянского ПО, которую злоумышленники доработали, усложнив его обнаружение и анализ.
Анализ инструментов, тактик и техник не позволил связать данную активность ни c одной из ранее известных APT-групп. Новая группа, названная нами Hellhounds, прикладывает значительные усилия для сокрытия своей активности на хостах и в сети. В интересы группы входят компании и государственные организации исключительно на территории Российской Федерации. Злоумышленники могут преследовать разные цели, но достоверно известно об одном случае полного уничтожения инфраструктуры.
Ближайшие события
10 хороших практик автоматизации на Selenium C#
Я хотела бы поделиться с вами несколькими хорошими практиками, которым я научилась в процессе работы – но как бы мне хотелось их знать, когда я только начала свое путешествие в мир автоматизированного тестирования. Хотя то, что мы называем «лучшей практикой», не обязательно подойдет для конкретного проекта или специалиста. В статье вы найдете советы о том, как можно улучшить свой фреймворк автоматизации на Selenium C#.
Как принимать платежи в Telegram | Оплата без всяких токенов и асинхронная обработка платежа
Как принимать платежи на своем сайте или в telegram используя библиотеку yoomoney-api.
Что нового в .NET 8?
.NET 8 вышел в релиз, значит можно начинать переносить свои проекты на новую версию. В этой статье мы рассмотрим новые улучшения и фишки: C# 12, производительность, Native AOT, GC, новые типы, направленные на повышение производительности, NuGet Audit и прочее.
Развертывание программного комплекса на Asp.net на российских ОС
В России все больше пользователей и организаций используют российские Linux системы. Но при подготовке пакетов для комплексных решений на этих системах могут возникнуть сложности, связанные с несовместимостью ПО, необходимостью настройки пакетов и т.д. В этой статье рассмотрю основные проблемы, с которыми наша команда столкнулась при развертывании проектного решения на российских Linux системах: Astra Linux, Alt Linux, Red OS. Этот опыт будет полезен для команд разработки, которые переходят на Linux и ранее не работали с ними.
Цель этой статьи не заключается в том, чтобы создать универсальную пошаговую инструкцию (поскольку она будет различаться в зависимости от конкретного случая), но помочь понять, с какими трудностями можно столкнуться при работе с системами, которые требуют доставки приложения через пакеты. Также расскажу, насколько трудоемким может быть проект, который включает развертывание на российских ОС.
В каких аспектах улучшилась производительность в ASP NET Core 8
ASP.NET Core 8 и .NET 8 обогатились многочисленными потрясающими нововведениями, благодаря которым повышается производительность. В этом посте мы подчеркнём некоторые улучшения, сделанные в ASP.NET Core, и покажем, как с их помощью можно нарастить скорость и эффективность работы веб-приложения. Этот пост можно считать продолжением Performance improvements in ASP.NET Core 7, выходившего в прошлом году. Естественно, при его подготовке я также вдохновлялся постом Performance Improvements in .NET 8. Многие из перечисленных улучшений также прямо или косвенно способствуют повышению производительности ASP.NET Core.
Книга «Blazor в действии» в правильном переводе команды DotNetRu
Совместно с издательством ДМК Пресс мы, сообщество DotNetRu, рады сообщить об окончании работы над переводом новой книги «Blazor в действии» Криса Сэйнти.
Получив первоначальный перевод от издателя, мы в сообществе постарались откорректировать текст и перевод так, чтобы перевод имел слаженный слог, не противоречил смыслу и сохранил оригинальность.
В статье расскажем, как строилась работа, послушаем мнение непосредственных участников и поделимся традиционным промокодом на книгу.
Изучаем Q#. Орёл или решка?
Как и бит, кубит допускает два собственных состояния, обозначаемых |0> и |1> (обозначения Дирака), но при этом может находиться и в их суперпозиции.
В общем случае его волновая функция имеет вид A|0>+B|1>, где A и B называются амплитудами вероятностей и являются комплексными числами, удовлетворяющими условию |A|^2+|B|^2=1 (но это не обязательно соблюдать при записи - всегда подразумевается, что происходит нормирование величин).
При измерении состояния кубита можно получить лишь одно из его собственных состояний.
Вероятности получить каждое из них равны соответственно |A|^2 и |B|^2.
Как правило, при измерении состояние кубита необратимо разрушается, чего не происходит при измерении классического бита.
В квантовых вычислениях, мы имеем факт, что применение трансформации Адамара H к кубиту в состоянии |0> даёт нам его в равновероятном состоянии для исходов |0> и |1>, то есть в состоянии |0>+|1>
Но как нам задать нужное состояние кубита, то есть с заранее заданными значениями A и B ?
Вернее, как задать нужное состояние кубита, используя только минимальный набор базовых операций? Ведь любой QDK должен включать в себя методы инициализации кубита (и желательно в требуемом состоянии).
Ну а мы ограничимся в данном примере операциями H и Controlled X.
Вклад авторов
sidristij 3013.4XaocCPS 1863.6sahsAGU 1303.2olegchir 1250.6mezastel 1199.6SergeyT 1140.6SergVasiliev 1121.0phillennium 1062.6marshinov 888.2chernikov 822.0