CodeBlanks Logo Icon CodeBlanks

IIncrementalGenerator

C# kursu · Uzman · Ders 38/47

IIncrementalGenerator ile artımlı source generator yazmayı öğrenirsin.

IIncrementalGenerator

IIncrementalGenerator, modern ve önbelleğe alınabilir (cacheable) bir generator arabirimidir. Eski ISourceGenerator'ın yerine geçti; her derlemede tüm sözdizim ağacını yeniden taramak yerine, yalnızca değişen kısımları yeniden işler.

Bir boru hattı (pipeline) kurarsın: her adım bir girdiyi dönüştürür ve sonucu önbelleğe alınır. Bu, büyük projelerde derleme süresini önemli ölçüde azaltır.

Artımlı pipeline tasarımı

Bir artımlı generator'da her adım bir IncrementalValueProvider veya IncrementalValuesProvider döndürür. Where ile süzer, Select ile dönüştürür, Collect ile toplarsın.

Her adım önbelleğe alınır; girdi değişmezse adım yeniden çalışmaz. Bu, saf (pure) fonksiyonlar gerektirir: aynı girdi her zaman aynı çıktıyı üretmeli.

Uygulama DTO süz ve üret

IncrementalDemo statik sınıfına public static List<string> FilterAndGenerate(IEnumerable<string> typeNames) metodu ekle. Gövdede typeNames.Where(name => name.EndsWith("Dto")).Select(name => $"public class {name} {{ }}").ToList() döndür. Main'de new[] { "UserDto", "Account", "OrderDto" } dizisini geçirip her sonucu yazdır.

Örnek çözümü göster
IncrementalDemo içine FilterAndGenerate ekle. Main'de foreach (var g in IncrementalDemo.FilterAndGenerate(new[] { "UserDto", "Account", "OrderDto" })) Console.WriteLine(g);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Linq;

static class IncrementalDemo
{
    public static List<string> FilterAndGenerate(IEnumerable<string> typeNames)
    {
        return typeNames
            .Where(name => name.EndsWith("Dto"))
            .Select(name => $"public class {name} {{ }}")
            .ToList();
    }
}

class Program
{
    static void Main()
    {
        foreach (var g in IncrementalDemo.FilterAndGenerate(new[] { "UserDto", "Account", "OrderDto" }))
        {
            Console.WriteLine(g);
        }
    }
}

Kendini test et

  1. Pipeline adımını tamamla

    names.Where(name => name.EndsWith("Dto")).____(name => $"public class {name} {{ }}").ToList();
    Cevabı göster
    names.Where(name => name.EndsWith("Dto")).Select(name => $"public class {name} {{ }}").ToList();
  2. IIncrementalGenerator'ın temel avantajı nedir?

    • Daha az kod yazmak
    • Çalışma zamanı reflection
    • Daha kısa dosya adları
    • Önbellekleme ile daha hızlı derleme
    Cevabı göster

    Önbellekleme ile daha hızlı derleme — Doğru. Artımlı yapı önbellekleme ile daha hızlı derleme sağlar.

  3. Pipeline metotlarını eşleştir

    Where
    Öğeleri süz
    Select
    Her öğeyi dönüştür
    Collect
    Sonuçları topla

Uzman bölümündeki tüm dersler