Tembel Değerlendirme Anlambilimi
Yineleyicilerin ertelenmiş yürütülmesini anlayın.
Tembel Değerlendirme Anlambilimi, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Ertelenmiş Yürütme
Yineleyiciler ve LINQ sorguları ertelenmiş yürütme kullanır: sorguyu tanımlamak neredeyse hiçbir işlem yapmaz. Çalışma yalnızca sonucu gerçekten, öğe öğe numaralandırdığınızda gerçekleşir.
Siz Numaralandırana Kadar Hiçbir Şey Çalışmaz
Bir yineleyici yöntemini çağırmak, gövdesini çalıştırmaz. Gövde yalnızca bir foreach (veya başka bir tüketici) ilk değeri istediğinde çalışmaya başlar.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Numbers()
{
Console.WriteLine("-- iterator body started --");
yield return 1;
yield return 2;
}
public static void Main()
{
var seq = Numbers();
Console.WriteLine("query created, body not run yet");
foreach (var n in seq) Console.WriteLine(n);
}
}Değerler Teker Teker Üretilir
Her yineleme, bir sonraki değeri üretmeye yetecek kadar yineleyiciyi çalıştırır. İstek üzerine değer çekmeye dayalı bu model, çok büyük dizilerde bile belleği düşük tutar.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Trace()
{
for (int i = 1; i <= 3; i++)
{
Console.WriteLine("producing " + i);
yield return i;
}
}
public static void Main()
{
foreach (var n in Trace())
Console.WriteLine("consumed " + n);
}
}Yeniden Numaralandırma Yeniden Çalıştırır
Ertelenmiş bir dizinin önbelleğe alınmış bir sonucu yoktur. Onu iki kez numaralandırmak, yineleyiciyi iki kez çalıştırır; bu, kaynak değişiyorsa veya işlem pahalıysa önemlidir.
using System;
using System.Collections.Generic;
public class Program
{
static int _calls = 0;
static IEnumerable<int> Counter()
{
_calls++;
yield return _calls;
}
public static void Main()
{
var seq = Counter();
foreach (var n in seq) Console.WriteLine(n);
foreach (var n in seq) Console.WriteLine(n);
Console.WriteLine("total runs: " + _calls);
}
}Güncel Durumu Yakalama
Yürütme ertelendiği için bir yineleyici, kaynağını tanımlandığı anda değil, numaralandırma sırasında okur. Sorgu tanımlandıktan sonra yapılan değişiklikler görünür olur.
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
var list = new List<int> { 1, 2 };
IEnumerable<int> doubled = Double(list);
list.Add(3); // added before enumeration
foreach (var n in doubled) Console.WriteLine(n);
}
static IEnumerable<int> Double(IEnumerable<int> nums)
{
foreach (var n in nums) yield return n * 2;
}
}Anında Yürütmeyi Zorlamak
Sonuçların anlık görüntüsünü almak için diziyi ToList() veya ToArray() ile somutlaştırınız. Bu işlem yineleyiciyi bir kez çalıştırır ve değerleri depolar; böylece daha sonraki kaynak değişikliklerinden bağımsız hâle gelir.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var list = new List<int> { 1, 2 };
List<int> snapshot = Double(list).ToList(); // executed now
list.Add(99);
Console.WriteLine(string.Join(",", snapshot));
}
static IEnumerable<int> Double(IEnumerable<int> nums)
{
foreach (var n in nums) yield return n * 2;
}
}Kısa Devreye Alma Çalışmayı Azaltır
Tüketiciler değerleri tembelce istediği için ilk eşleşme gibi bir işlem erken durabilir. Üretici, hiç istenmeyen değerleri hesaplamaz.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static IEnumerable<int> Numbers()
{
for (int i = 1; ; i++)
{
Console.WriteLine("checking " + i);
yield return i;
}
}
public static void Main()
{
int firstBig = Numbers().First(n => n > 3);
Console.WriteLine("found " + firstBig);
}
}Ertelenmiş Özel Durumlar
Bir yineleyicinin içindeki özel durum, yöntem çağrıldığında değil, numaralandırma hatanın bulunduğu satıra ulaştığında oluşturulur. Ön doğrulama yapılmasını bekliyorsanız bu durum sizi şaşırtabilir.
using System;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> Risky(int divisor)
{
yield return 10 / divisor; // throws only during enumeration
}
public static void Main()
{
var seq = Risky(0);
Console.WriteLine("no error yet");
try { foreach (var n in seq) Console.WriteLine(n); }
catch (DivideByZeroException) { Console.WriteLine("caught during enumeration"); }
}
}Tembel İşlem Hatları Ucuza Birleştirilir
Tembel işleçleri zincirlemek, bunların tekrar tekrar çalıştırılmasına neden olmaz. Her değer, istek üzerine tüm işlem hattından bir kez geçer; bu hem verimli hem de bellek dostudur.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var result = Enumerable.Range(1, 1000000)
.Where(n => n % 2 == 0)
.Select(n => n * n)
.Take(3);
foreach (var n in result) Console.WriteLine(n);
}
}Ne Zaman Somutlaştırmalı
Birden çok kez numaralandıracaksanız, kaynak değişebilecekse veya bir kaynağı serbest bırakmadan önce sonuçları yakalamanız gerekiyorsa somutlaştırınız. Aksi durumda bellek ve çalışma tasarrufu için tembel kalınız.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var evens = Enumerable.Range(1, 10).Where(n => n % 2 == 0).ToList();
// Safe to enumerate many times now
Console.WriteLine("count: " + evens.Count);
Console.WriteLine("sum: " + evens.Sum());
}
}Kendiniz Deneyiniz
Ertelenmiş yürütmeyi doğrudan gözlemleyiniz: bir sorgu tanımlanır, kaynak değiştirilir ve değişiklikler sonuçlarda ancak numaralandırma sırasında görünür.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var source = new List<int> { 1, 2, 3 };
var query = source.Where(n => n > 1); // not executed yet
source.Add(10);
source.Remove(2);
// Executes now, reflecting all changes
Console.WriteLine(string.Join(", ", query));
}
}Hızlı Kontrol
Ertelenmiş yürütme hakkında akıl yürütünüz.
Özet
Tembel (ertelenmiş) değerlendirme, bir diziyi yalnızca numaralandırıldığında çalıştırır.
- Sorguyu tanımlamak hiçbir iş yapmaz; onu tüketmek iş yapar.
- Yineleyiciyi yeniden numaralandırmak, onu yeniden çalıştırır.
- Kaynaklar numaralandırma sırasında okunur; bu nedenle daha sonraki değişiklikler görünür.
- Özel durumlar numaralandırma sırasında ortaya çıkar.
- Gerektiğinde somutlaştırmak için
ToList()/ToArray()kullanınız.
Sıkça Sorulan Sorular
“Tembel Değerlendirme Anlambilimi” dersi ücretsiz mi?
Evet — “Tembel Değerlendirme Anlambilimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Tembel Değerlendirme Anlambilimi” dersinde ne öğreneceğim?
Yineleyicilerin ertelenmiş yürütülmesini anlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Tembel Değerlendirme Anlambilimi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- yield return ile Yineleyici Yöntemleri
- yield break ve Erken Sonlandırma
- Tembel Değerlendirme Anlambilimi
- Özel Enumerable'lar