
Source generators в.NET: как они вытеснили рефлексию из стандартной библиотеки
badcasedaily1 5 минут назад Source generators в.NET: как они вытеснили рефлексию из стандартной библиотеки Средний 9 мин 49 Блог компании OTUS C++ * Программирование * .NET * Обзор Привет, Хабр! Открываете JIT‑логи...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. badcasedaily1 5 минут назад Source generators в. NET: как они вытеснили рефлексию из стандартной библиотеки Средний 9 мин 49 Блог компании OTUS C++ * Программирование * . NET * Обзор Привет, Хабр!
Открываете JIT‑логи свежезапущенного ASP. NET Core сервиса и видите, что внушительная часть тиков тратится на построение метаданных через рефлексию: типы пробегаются по GetType, свойства собираются через GetProperties, делегаты компилируются через Expression. Это работает давно и для большинства сценариев работает быстро после прогрева.
Технические детали
Проблема в том, что в современных условиях прогрев перестал быть допустимой роскошью, и от рефлексии в горячем пути приходится постепенно избавляться. За последние пять с лишним лет, начиная с. NET 5 и появления source generators в C# 9, стандартная библиотека постепенно переходит на кодогенерацию во время компиляции вместо рефлексии в runtime.
NET 10 в ноябре 2025 source generators проникли в JSON‑сериализацию, логирование, regex, конфигурацию, минимальные API, EF Core и десяток других мест. Разберём, почему так получилось, как это устроено внутри и какие изменения в подходе к коду это влечёт за собой. Чем source generator отличается от рефлексииРефлексия работает во время исполнения программы.
Когда JsonSerializer. Serialize(obj) встречает незнакомый тип, runtime обращается к метаданным сборки, читает список свойств, для каждого создаёт делегат‑аксессор, кэширует результат и применяет его к объекту. Первый вызов медленный, последующие быстрые за счёт кэша.
Отраслевые последствия
Стоимость: время на построение кэша, память на хранение делегатов, невозможность статического анализа. Source generator работает во время компиляции. Это специальный класс, который реализует интерфейс IIncrementalGenerator, регистрируется в проекте через и получает на вход синтаксическое дерево всего проекта.
Генератор анализирует код, находит интересующие его конструкции (например, классы с атрибутом ) и выдаёт дополнительные C#‑файлы, которые компилируются вместе с исходными. На выходе получается обычный код, без рефлексии, без runtime‑кэшей и без задержки на первый вызов. Принципиальная разница в том, что рефлексия откладывает работу до момента исполнения и платит за гибкость производительностью, source generator выполняет работу заранее и платит за производительность ограничением: типы должны быть известны во время компиляции.
Для подавляющего большинства сценариев в реальном коде это ограничение не критично. Json избавился от рефлексииСериализация JSON долгие годы оставалась эталонным случаем оправданной рефлексии.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




