Обновить
128K+

.NET *

Хаб со знаниями про .NET

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

7. Проектирование с помощью типов: Нестроковые типы

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

Можно ли использовать размеченные объединения с одним вариантом (SCDU, Single Case Descriminated Unions) не только со строками, но и с другими типами? Можно ли накладывать бизнес-ограничения на такие штука, как количество позиций в заказе или дата рождения?

Скотт Влащин делится секретами разработки бизнес-логики на языке с алгебраическими типами. Подробности внутри.

Читать далее

Новости

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

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

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

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

Читать далее

6. Проектирование с помощью типов: Типизированные строки

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

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

Разберёмся, как это выглядит в языках с алгебраическими типами.

Читать далее

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

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

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

Читать далее

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

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

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

Читать далее

MarkMello: быстрый Markdown viewer для тех, кто каждый день живёт в .md

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

В последнее время я почти каждый день работаю с Markdown-файлами.

Документация, спецификации, ADR, планы реализации, инструкции для AI-агентов — всё это удобно держать в .md. Формат простой, читаемый, хорошо ложится в git и нормально работает как для человека, так и для модели.

Но есть бытовая проблема.

Чтобы быстро посмотреть Markdown-файл, часто приходится открывать IDE. Разумеется да, любая нормальная IDE умеет показывать .md. Но запускать ради этого полноценную среду разработки — избыточно. Особенно если задача простая: кликнуть по файлу, быстро прочитать, скопировать кусок текста, закрыть.

Я начал искать лёгкий Markdown viewer и понял, что большинство найденных вариантов меня не устраивают.

Читать далее

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

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

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

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

Читать далее

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

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

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

В статье:

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

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

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

Читать далее

5. Проектирование с помощью типов: Делаем состояние явным

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

Пятый пост Скотта Влащина посвящён конечным автоматам (они же машины состояний или даже стейт-машины). Функциональные языки хорошо подходят для реализации конечных автоматов, а конечные автоматы хорошо подходят для реализации бизнес-логики.

Попробуем?

Читать далее

Мал, да удал: почему пять строк рефакторинга могут сказать о разработчике больше, чем весь его GitHub

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

Привет, Хабр! Жизнь не стоит на месте, как и мое исследование, так что пришла пора пересмотреть то, как я оцениваю код.

Изначально я опиралась на анализ целых репозиториев — мы вычисляли семантическую плотность и классические метрики кода. Результаты были многообещающими, но на практике я столкнулась с «шумом», который невозможно игнорировать:

Читать далее

Магия dotnet test. Как запускаются ваши тесты в .NET?

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

Вы когда-нибудь задумывались о том, как работают тестовые фрймворки в .NET? Ну вот когда вы пишите функцию, кликаете в IDE на треугольник, а потом — бац! — и получаете пару зелёных галочек. Вот как это происходит? Магия? Ну... отчасти да.

Привет! Меня зовут Дима Афонченко, я — техлид в Dodo Engineering. Сегодня расскажу, как устроена работа тестовых фреймворков в .NET и причём тут, собственно, магия. Будет интересно, поехали!

Читать далее

Interceptors и SourceGenerators: отказываемся от IL-инъекций

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

Привет! Я Дмитрий Сипаков, ведущий разработчик в Госсервисах Т-Банка. Расскажу про относительно новую фичу .NET — Interceptors: как они работают вместе со Source Generators и как с их помощью можно избавиться от бойлерплейта без IL-инъекций и сторонней магии.

Читать далее

WebAssembly: обзор технологии, эксперименты с числами и мечты о браузере без JS

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

WebAssembly находится в разработке уже более 8 лет. Технология прошла долгий путь развития и недавно разработчики из Bytecode Alliance выкатили версию 3.0.

О WebAssembly уже много материалов, но сегодня нам важна сама суть. У нас есть возможность, воспользовавшись любым из доступных языков программирования, написать модуль с необходимой нам логикой и запустить в исполняемой среде браузера. Разработчики обещают: модули будут быстрее и безопаснее, чем JavaScript, а также созданные ранее технологии, наподобие asm.js.

На связи Борис Мещеряков, frontend-разработчик в ПСБ и чаще всего мне приходится работать с javascript-фреймворками - React, Angular и прочими. Узнав о WebAssembly, я какое-то время наблюдал за его развитием. Мне стало интересно, может ли новая технология помочь мне уже сейчас? Какие ее возможности существуют на данный момент и какие реальны в будущем?

Разберёмся вместе?

Читать далее

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

4. Проектирование с помощью типов: Исследуем новые концепции

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

Четвёртый пост из серии Скотта Влащина посвящена предметной области. Как с помощью типов описывать бизнес-правила? Как типы позволяют углубить понимание предметной области?

Узнаем прямо сейчас.

Читать далее

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

Как мы строили MVP data lineage системы в ЮMoney

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

Привет, меня зовут Юля, я дата-инженер в департаменте аналитических решений ЮMoney. Мы разрабатываем и поддерживаем ETL(ELT)-процессы загрузки данных для BI-продуктов компании: отчётов, дашбордов, витрин, API и других.

В этой статье поделюсь, как мы разрабатывали MVP для построения data lineage системы и к каким выводам пришли, — так вы сможете адаптировать подход под свои процессы.

Проблема, которая привела нас к разработке MVP, заключается в том, что в начале работы над большинством задач требуется подготовительная аналитика: восстановить путь происхождения данных, чтобы понимать, какие ETL(ELT)-процессы будут затронуты и на что повлияют изменения. Это увеличивает время выполнения задачи. Но, что ещё существеннее, процесс достаточно рутинный: каждый раз необходимо проводить статический анализ кода и изучать документацию (при её наличии). Мы решили автоматизировать эту работу, чтобы иметь под рукой инструмент для построения пути данных по точкам их обработки и применения, — то есть создать data lineage систему.

Читать далее

3. Проектирование с помощью типов: Делаем недопустимые состояния непредставимыми

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

Новая глава из цикла Скотта Влащина. Обсуждаем, как сделать код надёжным с помощью развитых типов из F#.

Читать далее

Шестидесятилетний заключённый и лабораторная крыса. F# на Godot. Часть 14. RenderingServer на полную

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

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

<Картинка не влезла в превью.>

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

За остаток цикла мы должны выяснить, как можно строить среднеразмерные игровые сцены на F#, а также почему этот цикл называется так, как называется. Конкретно в этой главе мы разберёмся с RenderingServer-ом (бывший VisualServer), но не с нуля, а с позиций достигнутых в »Godot — рисование без правил» и »Прямоугольные тайловые миры». Если вы уже прочитали эти статьи, то вам должно быть известно, что рисование через RenderingServer — это довольно экзотический подход, который воспринимает хождение сквозь стены как рядовое событие. Авторы движка этому не препятствуют, но и не содействуют, поэтому документации по этому серверу — кот наплакал. Мне так и не удалось выудить ответы на все интересующие меня вопросы в словесной форме и их пришлось выковыривать при помощи живых экспериментов. Последние ни в статью, ни в проект не влезли, но тут важна сама парадигма, при которой мы всегда отталкиваемся от практики, а не от теории, которой пока просто нет.

Читать далее
1
23 ...