0Pricing
C# Academy · Lekcja

Koncepcja i przypadki użycia; generatory przyrostowe (omówienie)

Proszę poznać działanie generatorów, typowe przypadki użycia i ideę generatorów przyrostowych oraz emulację przyjazną dla C# 6 z użyciem atrybutów i klas partial.

Koncepcja i przypadki użycia; generatory przyrostowe (omówienie) to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 2. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 2 lekcji w sumie.

Czym jest generator

Cel: Poznanie generatorów kodu źródłowego i powodów, dla których są pomocne.

  • Analizują kod i generują nowe pliki C#
  • Świetnie nadają się do kodu szablonowego (mapperów, powiadomień i DTO)
  • Koncepcja inkrementalna: reagowanie tylko na zmienione dane wejściowe
  • W tej lekcji jest ona naśladowana za pomocą atrybutów i klas częściowych (C# 6)

Koncepcja klasy częściowej

Klasy partial pozwalają podzielić typ na wiele plików; generatory zwykle generują dodatkową część 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());
  }
}

Znaczniki atrybutów

Generatory skanują atrybuty, aby zdecydować, jaki kod wygenerować. Wykrywanie jest tu naśladowane za pomocą refleksji (w rzeczywistości odbywa się to podczas kompilacji).

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");
  }
}

Prezentacja szablonu kodu

Generator wygenerowałby kod w nowym pliku. Tutaj drukowany jest tylko prosty szablon, aby zobrazować tę koncepcję.

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);
  }
}

Przegląd generowania inkrementalnego

Generatory inkrementalne dzielą pracę na małe kroki.

  • Śledzą dane wejściowe (składnię i dodatkowe pliki)
  • Ponownie obliczają wynik tylko wtedy, gdy coś się zmieniło
  • Zapewniają szybsze kompilacje i mniej alokacji
  • Wskazówka projektowa: kroki powinny być czyste i deterministyczne

Gdzie sprawdzają się najlepiej

Zastosowania:

  • Kod szablonowy: INotifyPropertyChanged, mappery DTO
  • Sprawdzanie podczas kompilacji: mapy tras, wiązanie ustawień
  • Wydajność: unikanie refleksji w często wykonywanych fragmentach kodu
  • Synchronizacja dokumentacji i kodu: identyfikatory, stałe

Należy unikać generatorów w przypadku złożonej logiki czasu wykonywania; generowany kod powinien być niewielki i przewidywalny.

Rola generatora

Szybkie sprawdzenie: Co generatory kodu źródłowego robią podczas kompilacji?

Podsumowanie

Podsumowanie: Generatory analizują kod i generują kod źródłowy. Należy myśleć w kategoriach atrybutów i klas partial, utrzymywać niewielkie wyniki oraz (inkrementalnie) ponownie obliczać tylko to, co się zmieniło.

Często zadawane pytania

Czy lekcja „Koncepcja i przypadki użycia; generatory przyrostowe (omówienie)” jest bezpłatna?

Tak — pełny tekst „Koncepcja i przypadki użycia; generatory przyrostowe (omówienie)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 2 lekcji w sumie.

Co nauczysz się w „Koncepcja i przypadki użycia; generatory przyrostowe (omówienie)”?

Proszę poznać działanie generatorów, typowe przypadki użycia i ideę generatorów przyrostowych oraz emulację przyjazną dla C# 6 z użyciem atrybutów i klas partial. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 2.

Ile czasu zajmuje lekcja „Koncepcja i przypadki użycia; generatory przyrostowe (omówienie)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcja i przypadki użycia; generatory przyrostowe (omówienie)
  2. Doświadczenie programisty i ograniczenia
← Powrót do C# Academy