Обновить
256K+

C# *

Объектно-ориентированный язык программирования

142,02
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Архитектура MassTransit: как устроена библиотека под капотом

Уровень сложностиСредний
Время на прочтение49 мин
Охват и читатели9.7K

Мне давно было интересно, как устроена библиотека MassTransit изнутри. Хотелось разобраться в её архитектуре, понять, как она развивалась, и почему порой в ней бывает непросто ориентироваться.

Если вам тоже интересно, что скрывается за consumers, publishers и sagas - приглашаю к чтению.

Читать далее

Генерация типов в Runtime

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели11K

Иногда в разработке возникают задачи, требующие создания типов в рантайме. Чаще всего это необходимо при написании декларативных сервисов, высокопроизводительных мапперов или систем с динамическим проксированием.

В этой статье расмотрим как создавать типы используя Reflection.Emit и реализовывать методы через Expression Trees

Читать далее

Почему if/else убивает ИИ врагов в Unity и как от этого уйти

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели11K

ИИ врагов в Unity часто начинается с пары аккуратных if/else, а заканчивается кодом, где новое поведение ломает старое, приоритеты конфликтуют, а отладка превращается в раскопки.

В статье разберём, почему такая логика быстро перестаёт масштабироваться, где FSM тоже начинает буксовать, и как Behaviour Tree помогает собрать поведение врага из понятных, переиспользуемых узлов — на C#-примерах с Selector, Sequence, Decorator, Blackboard и типичными ошибками, которые всплывают уже в реальном проекте на Unity.

Разобрать подход

Свой маленький GIS: приложение для мультиспектральных и гиперспектральных снимков

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели14K

Привет, Хабр. Меня зовут Алексей, я C#-разработчик. В этой статье хочу рассказать о своём дипломном проекте очень запавшем мне в душу, который я делал на тему обработки изображений, GIS и дистанционного зондирования Земли. Даже спустя годы мне интересна данная тема и она по-прежнему остаётся очень перспективной в различных отраслях.

Идея была в том, чтобы собрать небольшое настольное приложение, которое умеет работать с реальными спутниковыми данными: Landsat 8, Sentinel-2 и AVIRIS. То есть открывать не готовую RGB-картинку, а набор спектральных каналов, собирать из них естественные и псевдоцветные изображения, считать растровые индексы, выделять эталоны прямо на снимке, классифицировать пиксели, сегментировать изображение и пробовать более исследовательские вещи вроде EMD-разложения.

В итоге получилась учебно-исследовательская программа, но с полным рабочим циклом: от чтения спутникового архива до сохранения информативного результата обработки. Ниже расскажу, зачем вообще нужны такие снимки, какие особенности есть у разных спутниковых данных, что делает приложение и какие алгоритмы оказались самыми интересными.

Читать далее

Вы неправильно используете IDisposable: почему using не спасает, когда объект утекает в другой поток

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели13K

using в C# выглядит как универсальная страховка от утечек ресурсов, пока объект живёт строго внутри одного метода. Но стоит вернуть его наружу, передать в фоновую задачу, положить в коллекцию или доверить DI‑контейнеру — и привычное правило начинает работать против вас.

В статье разберём типичные сценарии, где IDisposable превращается в источник нестабильных багов: закрытые раньше времени соединения, гонки с Task.Run, утечки обработчиков и тот самый HttpClient, который лучше не создавать на каждый запрос.

Читать далее

Статический архетип в ECS: локальность данных без неявных перемещений компонент

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели9.5K

У архетипов в ECS есть неотъемлимое преимущество перед обычными sparse set'ами - локальность данных. Но есть и существенная проблема - хаотическое копирование данных при миграции из одного архетипа в другой. Что если попробовать избавиться от этого недостатка, оставив локальность данных? Предлагаю рассмотреть статический архетип, который требует явного вызова метода для миграции данных.

Читать далее

Как я в 17 лет кратно увеличил производительность компании крупного застройщика Чебоксар

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7.2K

Мой знакомый работал в компании, которая занимается проектированием (эта организация принадлежит крупнейшему застройщику Чебоксар, но я не называю её по правилам Хабра). Он рассказал, что расчёты удельных мощностей занимают очень много времени и неудобны. А таких расчётов в компании — десятки в день.

Проблема была в следующем: сотрудник вводит одну величину, а по ней ищет другие в таблицах. Пока человек найдёт нужное значение в таблице, внесёт его в ячейку Excel — и так ещё 4 раза на один расчёт — проходит реально много времени. А если он ошибётся (что вполне вероятно при рутине)? Расчёты придётся переделывать.

Читать далее

CraftHub для VS Code: редактируй JSON как таблицу прямо в редакторе

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели8.1K

Если вы хоть раз ловили себя на том, что ищете нужную строку в 300-строчном JSON — эта статья для вас. CraftHub теперь живёт прямо в VS Code: открыл файл, переключился в таблицу, поправил, переключился обратно

Читать далее

Рассказ о поездке на конференцию инди‑разработчиков «Игровая индустрия 2026» в Минске

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели9.6K

В жизни не раз случаются внезапные события, о которых ты даже не подозревал за очень небольшой срок до их наступления. Тем жизнь и хороша, что она не расписана для каждого от начала до конца. Вот и конференция в Минске 22 апреля 2026 года свалилась мне на голову достаточно внезапно и поломала все мои планы. Но обо всём по порядку.

Читать далее

Виртуальная экранная клавиатура, реализация через GDI+

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели8.3K

Реализация экранной клавиатуры на C# с использованием GDI+.

В статье рассказано, как создать пользовательский отрисованный элемент управления аналогичный встроенной клавиатуре Windows, но с более гибкими настройками.

Читать далее

Unity Builder — как мы победили боль с ручными сборками и написали своё приложение

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8.2K

Как мы автоматизировали сборку Unity-проектов под несколько платформ: прошли через Jenkins, GitHub Actions с game-ci и сорокаминутные билды — и в итоге написали собственный инструмент.

В статье:

Почему Jenkins и GitHub Actions не подошли

Что такое Unity Builder и какую боль закрывает

Визуальный пайплайн, параллельные задачи, FTP-интеграция

Читать далее

Как использовать Rust внутри приложений на .NET MAUI

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.9K

Когда производительность начинает иметь значение

По производительности Rust находится в той же лиге, что и C++, но с заметно более дружелюбной моделью безопасности. Возможно, вы уже слышали о командах, которые постепенно переходят на Rust, заменяя существующий код. А если вам уже приходилось бороться с лагами от GC или пытаться сделать плавную анимацию, отсутствие сборщика мусора начинает выглядеть особенно заманчиво.

Но можно ли сделать так, чтобы использовать Rust внутри приложения .NET для Android, iOS, MacCatalyst и Windows было действительно удобно?

Читать далее

CraftHub — или как я устал редактировать JSON вручную и написал редактор

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели16K

Всё началось с моего друга. Он занимался разработкой игр на Unity, и в какой-то момент подкинул мне идею — точнее, жалобу, которая быстро переросла в идею.

Огромное количество времени у него уходило не на саму разработку, а на редактирование JSON-файлов. Конфиги предметов, параметры врагов, таблицы балансировки, локализации — всё это JSON. И всё это нужно было либо править руками в текстовом редакторе, рискуя сломать структуру одной лишней запятой, либо писать очередной одноразовый скрипт-конвертер, который через неделю уже никто не помнит где лежит.

Читать далее

Ближайшие события

StaticECS — Bitmap Entity Component System

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели15K

За десятилетия существования ECS сложились два фундаментальных способа хранить компоненты: архетипы (Unity DOTS, Flecs, Bevy) и sparse sets (EnTT, LeoECS). Каждый из них несёт структурные ограничения, которые не устраняются оптимизацией реализации — они вытекают из самой модели данных.

StaticEcs — третья модель. Она основана на инвертированном иерархическом битовом индексе: не сущности хранят маски своих компонентов, а компоненты хранят битовые карты сущностей. Фильтрация запроса — это побитовое AND, обрабатывающее 64 сущности за одну инструкцию CPU. Добавление или удаление компонента меняет один бит и не перемещает никаких данных.

В статье разбираю, как устроена эта архитектура, чем она отличается от архетипов и sparse sets, и что даёт на практике.

Читать далее

Распознавание лиц с потока камеры в .NET MAUI

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9K

Сегодняшние приложения для мобильных и настольных устройств умеют распознавать на изображениях почти что угодно, - от QR-кодов до количества калорий в еде на на фото. На платформах, которые поддерживает .NET MAUI, для этого можно использовать разные варианты, как локальные ML-движки вроде TensorFlow Lite, нативные SDK для конкретной платформы, типа ARKit на iOS, так и разные Vision API. Далее все зависит уже от реализации в приложении.

И вот, когда речь идет пойдет о распознавании изображений от камеры, наш вариант - пакет DrawnUi.Maui.Camera. В предыдущей статье я показывал, как использовать SkiaCamera для анализа аудио с AI в реальном времени, а сегодня займемся видео: разберем на примере распознавания лиц.

Читать далее

Почему Proptech — одна из самых сложных ИТ-индустрий (и почему это круто)

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели22K

Привет, Хабр!

Когда говорят про ИТ в строительстве, многие представляют довольно скромную картину: техподдержку, корпоративный сайт и пару интеграций с ERP. На практике всё давно выглядит иначе. Современный девелопер - это десятки цифровых продуктов: BIM-модели зданий, системы управления строительством, аналитические платформы, CRM, мобильные приложения жителей и даже собственные ИИ-платформы.

Меня зовут Саша. Я занимаюсь развитием операционной модели ИТ-департамента девелопера Sminex. Кстати, пару лет назад я уже писал на Хабре статью про работу системного аналитика 1С в девелопменте. Тогда речь шла о более узком срезе - роли специалиста внутри одного класса корпоративных систем и о том, как эти системы помогают бизнесу.

С тех пор моя роль внутри ИТ изменилась, и теперь я больше фокусируюсь на работе всей цифровой экосистемы компании. Поэтому хочу поговорить не про одну систему и одну роль, а про то, как вообще устроен PropTech на уровне всей ИТ-инфраструктуры девелопера.

Телепорт в ИТ Sminex

Проектирование иерархии моделей данных в многослойном приложении

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели9.1K

При проектировании многослойной архитектуры приложения одной из главных задач является формирование набора моделей данных каждого слоя и определение порядка взаимодействия моделей данных между собой. Под взаимодействием понимаются потоки данных, передаваемые из одной модели данных в другую. В общем случае взаимодействие между моделями данных двунаправленное.

Рассмотрим модель данных application model, которая потребуется в дальнейшем изложении и которая используется в паттерне CQRS.

Реализация архитектурного паттерна CQRS, используемого в приложении для функционала application logic, представляет собой набор классов наследников базовых классов QueryHandler / CommandHandler и набор классов данных, которые являются наследниками базовых классов Query / Command. Классы наследники Query / Command представляют собой модель данных application logic. Такую модель данных логично назвать application model.

Используя application model и другие известные модели данных слоёв приложения можно построить полную схему моделей данных многослойной архитектуры приложения.

Читать далее

От слов к числам: как математически отличить Middle от Senior

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели7.8K

Привет, Хабр! В своей первой статье про анализ вакансий C#/.Net разработчиков на рынке я выделила очень интересное замечание, которое определило тему сегодняшней статьи – «не количество навыков делает из мидла синьора, а образ его мышления». Построить граф связности компетенций для синьора это конечно хорошо, но к сожалению, на практике применить его достаточно сложно.

Сделав упор на навыки в своем исследовании, я получила зашумленный датасет, не поддающийся адекватной кластеризации. Так что пришло время попытаться пересмотреть подход к использованию полученных данных и попытаться вычленить из них тот качественный скачок, который отделит мидла от синьора.

Читать далее

Labeled break and continue в C# 15 — разбор плохого примера и поиск реального кейса

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели9K

Всем привет. В последнее время в одной профессиональной соцсети я все чаще стал натыкаться на посты, связанные с dotnet C# тематикой. К сожалению, эти посты в большинстве своем не содержат полезной информации. Скорее всего они создаются для охвата аудитории с целью привлечения трафика на сторонние платформы по продаже курсов для разработчиков. По-моему, этот способ называется "воронка продаж" (поправьте, если я ошибаюсь). Как правило, эти посты затрагивают какую-то не очень сложную тему и содержат примеры кода. Недавно мне попался очередной пост, в котором автор пытался показать пример использования новой фичи labeled break and continue. Это новая фича, которую добавили в C# 15 (dotnet 11). На момент написания она была принята в Working Set, но финального релиза ещё не было. Ниже код, похожий на оригинал из поста. Он разделен на 2 секции: "как делали раньше" и "как сделать используя новый подход":

Стандартный способ:

Читать разбор

Выделение регистров процессора при помощи генетического алгоритма

Время на прочтение16 мин
Охват и читатели12K

Эксперимент, который многое объясняет

Оригинал этого поста также вошёл в число документов по проектированию платформы .NET: lsra-heuristic-tuning.

Читать далее