Концепция и варианты применения; инкрементные генераторы (обзор)
Узнайте, что делают генераторы, где их обычно применяют, в чем идея инкрементных генераторов и как эмулировать их в C# 6 с помощью атрибутов и partial-классов.
«Концепция и варианты применения; инкрементные генераторы (обзор)» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 2. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 2 уроков всего.
Что такое генератор
Цель: узнать, что такое генераторы исходного кода и чем они полезны.
- Они анализируют ваш код и создают новые файлы C#
- Полезны для шаблонного кода (сопоставителей, уведомлений, DTO)
- Идея инкрементальности: реагировать только на изменившиеся входные данные
- Здесь мы имитируем этот подход с помощью атрибутов и partial-классов (C# 6)
Идея partial-класса
partial-классы позволяют разделить тип между файлами; генераторы обычно создают дополнительную часть partial.
using System;
// Partial lets code live in multiple files; generators often emit a second part.
public partial class Person
{
// "User" code (hand-written)
public string FirstName;
public string LastName;
}
// Imagine another file is generated with helpers.
public partial class Person
{
// This region simulates "generated" members.
public string FullName()
{
// simple boilerplate a generator could write
return (FirstName ?? """") + " " + (LastName ?? """");
}
}
public class Program
{
public static void Main(string[] args)
{
Person p = new Person();
p.FirstName = "Ada";
p.LastName = "Lovelace";
Console.WriteLine(p.FullName());
}
}
Маркеры-атрибуты
Генераторы просматривают атрибуты, чтобы решить, какой код создать. Мы имитируем обнаружение с помощью рефлексии (в реальных проектах — во время сборки).
using System;
using System.Reflection;
// Marker attribute a generator would search for
[AttributeUsage(AttributeTargets.Class)]
public sealed class AutoNotifyAttribute : Attribute { }
// A class we want to augment (emulating generator input)
[AutoNotify]
public class Settings
{
public string Theme; // we wish to auto-generate a property wrapper
}
// In real generators, Roslyn would find [AutoNotify] and emit code.
// Here we only "discover" the attribute at runtime (emulation).
public class Program
{
public static void Main(string[] args)
{
Type t = typeof(Settings);
object[] at = t.GetCustomAttributes(typeof(AutoNotifyAttribute), false);
Console.WriteLine(at.Length > 0 ? "Marker found" : "No marker");
}
}
Демонстрация шаблона кода
Генератор создал бы код в новом файле. Мы лишь выводим простой шаблон, чтобы наглядно показать эту идею.
using System;
using System.Text;
// Tiny template that prints C# code a generator could add.
public static class Template
{
public static string EmitAutoProperty(string className, string fieldName)
{
// Very small example; real generators would use syntax trees.
StringBuilder sb = new StringBuilder();
sb.AppendLine("public partial class " + className);
sb.AppendLine("{");
sb.AppendLine(" public string " + Upper(fieldName) + "");
sb.AppendLine(" {");
sb.AppendLine(" get { return this." + fieldName + "; }");
sb.AppendLine(" set { this." + fieldName + " = value; /* notify here */ }");
sb.AppendLine(" }");
sb.AppendLine("}");
return sb.ToString();
}
private static string Upper(string name)
{
if (string.IsNullOrEmpty(name)) return name;
if (name.Length == 1) return name.ToUpperInvariant();
return char.ToUpperInvariant(name[0]) + name.Substring(1);
}
}
public class Program
{
public static void Main(string[] args)
{
// Show what the "generated" code could look like
string code = Template.EmitAutoProperty("Settings", "theme");
Console.WriteLine(code);
}
}
Обзор инкрементального подхода
Инкрементальные генераторы разделяют работу на небольшие шаги.
- Отслеживают входные данные (синтаксис и дополнительные файлы)
- Пересчитывают результат только после изменений
- Ускоряют сборку и уменьшают количество выделений памяти
- Совет по проектированию: делайте шаги чистыми и детерминированными
Где они особенно полезны
Сценарии использования:
- Шаблонный код: INotifyPropertyChanged, сопоставители DTO
- Проверки во время компиляции: карты маршрутов, привязка настроек
- Производительность: отказ от рефлексии на критических участках кода
- Синхронизация документации и кода: идентификаторы, константы
Не используйте генераторы для сложной логики во время выполнения; пусть создаваемый код будет небольшим и предсказуемым.
Роль генератора
Повторение
Повторение: генераторы анализируют ваш код и создают исходный код. Мыслите в терминах атрибутов и частичных классов, делайте результаты небольшими и при инкрементальном подходе пересчитывайте только изменившиеся части.
Часто задаваемые вопросы
Урок «Концепция и варианты применения; инкрементные генераторы (обзор)» бесплатный?
Да — полный текст урока «Концепция и варианты применения; инкрементные генераторы (обзор)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 2 уроков всего.
Чему я научусь в уроке «Концепция и варианты применения; инкрементные генераторы (обзор)»?
Узнайте, что делают генераторы, где их обычно применяют, в чем идея инкрементных генераторов и как эмулировать их в C# 6 с помощью атрибутов и partial-классов. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 2.
Сколько времени занимает урок «Концепция и варианты применения; инкрементные генераторы (обзор)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Концепция и варианты применения; инкрементные генераторы (обзор)
- Удобство разработки и ограничения