0Pricing
C# Academy · レッスン

概念とユースケース、インクリメンタルジェネレーター(概要)

ジェネレーターの役割、典型的なユースケース、インクリメンタルジェネレーターの考え方、属性とpartial classを使ったC# 6向けのエミュレーションを学びます。

「概念とユースケース、インクリメンタルジェネレーター(概要)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/2です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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 マッパー
  • コンパイル時チェック: ルートマップ、設定のバインディング
  • パフォーマンス: ホットパスでのリフレクションを回避
  • ドキュメントとコードの同期: ID、定数

避けるべき場面: 複雑な実行時ロジックには使用せず、出力は小さく予測可能に保ちます。

ジェネレーターの役割

確認問題: C# のソースジェネレーターは、ビルド時に何をしますか。

まとめ

まとめ: ジェネレーターはコードを調査し、ソースを生成します。属性 + partial という形で考え、出力を小さく保ち、(インクリメンタルに)変更された部分だけを再計算します。

よくある質問

「概念とユースケース、インクリメンタルジェネレーター(概要)」レッスンは無料ですか?

はい。「概念とユースケース、インクリメンタルジェネレーター(概要)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全2レッスンが含まれています。

「概念とユースケース、インクリメンタルジェネレーター(概要)」で何を学びますか?

ジェネレーターの役割、典型的なユースケース、インクリメンタルジェネレーターの考え方、属性とpartial classを使ったC# 6向けのエミュレーションを学びます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/2です。

「概念とユースケース、インクリメンタルジェネレーター(概要)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 概念とユースケース、インクリメンタルジェネレーター(概要)
  2. 開発者体験と制限事項
← C# Academyに戻る