C#
IIncrementalGenerator
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
-
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();
-
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.
-
Pipeline metotlarını eşleştir
- Where
- Öğeleri süz
- Select
- Her öğeyi dönüştür
- Collect
- Sonuçları topla
Sıradaki ders: Generator attribute