Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tip
Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın. Söz diziminin tamamı için dil başvurusundaki yineleme deyimlerine bakın.
Başka bir dilden mi geliyorsunuz? Dört C# döngüsünün de (foreach, while, do-whileve for) Java, C++ ve JavaScript'te doğrudan eşdeğerleri vardır. En sık foreach kullanırsınız. Java’daki geliştirilmiş for veya JavaScript’teki for...of gibi, bir koleksiyon üzerinde dizin kullanmadan yineleme yapar.
Yineleme deyimleri art arda bir kod bloğu çalıştırır. Blok üzerinden geçen her geçiş bir yinelemedir ve yinelenen bir blok bir döngüdür. C# dört döngü sağlar. Koleksiyonlar için foreach ile başlayın, yineleme bir koşul tarafından denetlendiğinde while ve do-while kullanın, açık bir indekse ihtiyaç duyduğunuzda ise for kullanın.
foreach ile bir koleksiyonda yineleme yapma
foreach deyimi, bir koleksiyondaki her öğe için gövdesini sırayla bir kez çalıştırır. Bir dizini veya sınır denetimini yönetmediğiniz için koleksiyon okumak için en yaygın seçenektir.
foreach deyimi tipik bire bir hataları engeller:
string[] names = ["Ana", "Ben", "Cleo"];
// foreach reads each element in order. It's the default loop for
// collections: no index to manage and no off-by-one mistakes.
foreach (string name in names)
{
Console.WriteLine(name); // => Ana, then Ben, then Cleo
}
foreach, diziler, List<T> ve Dictionary<TKey,TValue> dahil olmak üzere C#'ın bir sıralama olarak tanıdığı her türle çalışır. Yineleme değişkeni (name önceki örnekte) salt okunur olduğundan döngü içinde yeniden atayamazsınız.
Bir döngünün gövdesi, atama veya yöntem çağrısı gibi tek bir deyimdir. Bir blok deyimi, sıfır veya daha fazla deyimi küme ayraçları içine alan tek bir deyimdir ({ }).
Birçok kodlama standardı, tek bir deyim için bile döngü gövdesini süslü parantezler içine almanızı önerir. Ayraçlar kapsamı açık hale getirir. Yaygın bir hatayı önler: daha sonra her yinelemede çalışmasını beklediğiniz ikinci bir satır eklersiniz, ancak bu satır bunun yerine döngüden sonra bir kez çalışır. Yalnızca küme ayraçları, hangi ifadelerin döngüye ait olduğunu belirler. C# boşluğu önemli olarak ele almaz, bu nedenle tek başına girintileme hiçbir zaman yapmaz. Süslü parantezler, tek bir satır olsa bile geçerlidir: blok, döngünün yinelediği tek deyimdir. Kodunuzu okunabilirlik için girintileyin, ancak bloğu tanımlamak için ayraçları kullanın.
Bir koşul sağlandığı sürece yinele while
Döngü while , her yinelemeden önce Boole koşulunu denetler. Koşul başlangıçta false ise, gövde hiç çalışmaz; bu yüzden while döngüsü sıfır veya daha fazla kez çalışır:
int countdown = 3;
// A while loop checks its condition before each iteration, so the body
// runs zero or more times.
while (countdown > 0)
{
Console.WriteLine(countdown); // => 3, then 2, then 1
countdown--;
}
Döngü içindeki bir şeyin koşulu değiştirdiğinden emin olun. Önceki örnekte, countdown-- sonunda koşulunu falseoluşturur. Koşulu hiçbir zaman false olmayan bir döngü sonsuza kadar çalışır.
Gövdeyi en az bir kez do-while çalıştırın
Bir do-while döngüsü, her yinelemeden sonra koşulunu denetler; bu nedenle gövde her zaman en az bir kez yürütülür. Girişin istenmesi ve ardından doğrulanması gibi koşulu değerlendirebilmeniz için ilk geçişin gerçekleşmesi gerektiğinde bunu kullanın:
int attempts = 0;
// A do-while loop runs its body once, then checks the condition. Use it
// when the body must run at least one time.
do
{
attempts++;
Console.WriteLine($"Attempt {attempts}"); // => Attempt 1, then Attempt 2, then Attempt 3
}
while (attempts < 3);
for ile say
for Döngü deyimi üç bölümden oluşur: döngüden önce bir kez çalışan başlatıcı, her yinelemeden önce denetlenen bir koşul ve her yinelemeden sonra çalışan bir yineleyici. Yalnızca öğelere değil, indisin kendisine ihtiyaç duyduğunuzda for kullanın. Genellikle, değerini okumak yerine öğesini değiştirmek istediğinizde dizine ihtiyacınız vardır.
// A for loop fits when you need an explicit index. The three parts are
// the initializer, the condition, and the iterator.
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i); // => 0, then 1, then 2
}
Öğeleri yalnızca okuduğunuzda, konumları kullanmadığınızda veya yeni değerler atamadığınızda tercih edin foreach. Amacı daha net belirtir ve dizin aritmetiğini önler.
break ve continue ile çıkın veya atlayın
İki atlama deyimi, her döngüde size daha ayrıntılı denetim sağlar. deyimi break döngüden hemen çıkar ve kalan yinelemeleri atlar:
int[] numbers = [2, 4, 7, 8];
// break stops the loop immediately, skipping any remaining elements.
foreach (int number in numbers)
{
if (number % 2 != 0)
{
Console.WriteLine($"First odd number: {number}"); // => First odd number: 7
break;
}
}
deyimi continue geçerli yinelemenin geri kalanını atlar ve sonrakine geçer:
int[] values = [1, 2, 3, 4, 5];
// continue skips the rest of the current iteration and moves to the next.
foreach (int value in values)
{
if (value % 2 == 0)
{
continue; // skip even numbers
}
Console.WriteLine(value); // => 1, then 3, then 5
}
Bir zaman uyumsuz akışı await foreach ile yineleyin
Bir eşzamansız akış, her bir sonraki öğeyi üretmek için eşzamansız bir görev kullanan bir okuyucudur. C# bunu arabirimiyle IAsyncEnumerable<T> temsil eder. Web API'sinden sayfalar veya veritabanından satırlar gibi zaman içinde gelen veriler bu modele uyar: sonraki öğeyi almak, anında dönüş yerine beklenebilir bir işlemdir.
Zaman uyumsuz bir akışı tüketmek için await anahtar sözcüğünü foreach ifadesinden önce yerleştirin. Her yineleme bir sonraki öğeyi bekler; dolayısıyla iş parçacığını engellemek yerine, bu öğe üretilene kadar döngü askıda kalır:
private static async Task AwaitForeachExample()
{
// await foreach consumes an asynchronous stream. Each iteration can
// suspend while the next element is produced.
await foreach (int value in GenerateAsync())
{
Console.WriteLine(value); // => 0, then 1, then 2
}
}
private static async IAsyncEnumerable<int> GenerateAsync()
{
for (int i = 0; i < 3; i++)
{
await Task.Delay(1); // stand-in for real asynchronous work
yield return i;
}
}
Zaman uyumsuz akışlar, async ve await üzerine kuruludur. Ayrıntılı bir açıklama için bkz. Zaman uyumsuz akışlar oluşturma ve kullanma.