0Pricing
C# Academy · Урок

Концепция и варианты применения; инкрементные генераторы (обзор)

Узнайте, что делают генераторы, где их обычно применяют, в чем идея инкрементных генераторов и как эмулировать их в 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
  • Проверки во время компиляции: карты маршрутов, привязка настроек
  • Производительность: отказ от рефлексии на критических участках кода
  • Синхронизация документации и кода: идентификаторы, константы

Не используйте генераторы для сложной логики во время выполнения; пусть создаваемый код будет небольшим и предсказуемым.

Роль генератора

Быстрая проверка: что делают генераторы исходного кода C# во время сборки?

Повторение

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

Часто задаваемые вопросы

Урок «Концепция и варианты применения; инкрементные генераторы (обзор)» бесплатный?

Да — полный текст урока «Концепция и варианты применения; инкрементные генераторы (обзор)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 — локальная установка не требуется.

Все уроки этого курса

  1. Концепция и варианты применения; инкрементные генераторы (обзор)
  2. Удобство разработки и ограничения
← Назад к C# Academy