Yineleme deyimleri - for, foreach, dove while

Yineleme deyimleri art arda bir deyim veya deyim bloğu yürütür. deyimifor: belirtilen Boole ifadesi olarak değerlendirilirken gövdesini trueyürütür. deyimiforeach: bir koleksiyonun öğelerini numaralandırır ve koleksiyonunun her öğesi için gövdesini yürütür. deyimido: gövdesini bir veya daha fazla kez koşullu olarak yürütür. deyimiwhile: gövdesini koşullu olarak sıfır veya daha fazla kez yürütür.

Yineleme deyiminin gövdesindeki herhangi bir noktada, break deyimini kullanarak döngüden çıkabilirsiniz. continue deyimini kullanarak döngüdeki bir sonraki yinelemeye adım atabilirsiniz.

deyimi for

Belirtilen for Boole ifadesi olarak değerlendirilirken deyimi bir deyimini veya deyim bloğunu trueyürütür. Aşağıdaki örnek, bir tamsayı sayacı üçten küçükken gövdesini yürüten deyimini gösterir for :

for (int i = 0; i < 3; i++)
{
    Console.Write(i);
}
// Output:
// 012

Yukarıdaki örnekte deyiminin öğeleri gösterilmektedir for :

  • Döngüye girmeden önce yalnızca bir kez yürütülen başlatıcı bölümü. Genellikle, bu bölümde bir yerel döngü değişkeni bildirir ve başlatırsınız. Bildirilen değişkene deyiminin dışından for erişilemiyor.

    Önceki örnekteki başlatıcı bölümü bir tamsayı sayacı değişkeni bildirir ve başlatır:

    int i = 0
    
  • Döngüdeki bir sonraki yinelemenin yürütülmesi gerekip gerekmediğini belirleyen koşul bölümü. Değerlendirmesi true varsa veya yoksa sonraki yineleme yürütülür; aksi takdirde döngüden çıkarılır. Koşul bölümü bir Boole ifadesi olmalıdır.

    Yukarıdaki örnekteki koşul bölümü, bir sayaç değerinin üçten küçük olup olmadığını denetler:

    i < 3
    
  • Döngü gövdesinin her yürütülmesinden sonra ne olacağını tanımlayan yineleyici bölümü.

    Önceki örnekteki yineleyici bölümü sayacı artırır:

    i++
    
  • Bir deyim veya deyim bloğu olması gereken döngünün gövdesi.

Yineleyici bölümü, virgülle ayrılmış olarak aşağıdaki deyim ifadelerinden sıfır veya daha fazlasını içerebilir:

  • veya gibi ++i ön ek veya sonek artım ifadesii++
  • veya gibi --i ön ek veya sonek azaltma ifadesii--
  • Atama
  • yöntemi çağırma
  • await ifadesi
  • yeni işlecini kullanarak nesne oluşturma

Başlatıcı bölümünde bir döngü değişkeni bildirmezseniz, başlatıcı bölümündeki önceki listede yer alan ifadelerin sıfırını veya daha fazlasını da kullanabilirsiniz. Aşağıdaki örnekte başlatıcı ve yineleyici bölümlerinin daha az yaygın kullanımları gösterilmektedir: başlatıcı bölümündeki bir dış değişkene değer atama, hem başlatıcı hem de yineleyici bölümlerinde bir yöntemi çağırma ve yineleyici bölümündeki iki değişkenin değerlerini değiştirme:

int i;
int j = 3;
for (i = 0, Console.WriteLine($"Start: i={i}, j={j}"); i < j; i++, j--, Console.WriteLine($"Step: i={i}, j={j}"))
{
    //...
}
// Output:
// Start: i=0, j=3
// Step: i=1, j=2
// Step: i=2, j=1

deyiminin tüm bölümleri for isteğe bağlıdır. Örneğin, aşağıdaki kod sonsuz for döngüsü tanımlar:

for ( ; ; )
{
    //...
}

deyimi foreach

deyimi, foreach aşağıdaki örnekte gösterildiği gibi veya arabirimini uygulayan System.Collections.IEnumerable türün bir örneğindeki her öğe için bir deyim veya System.Collections.Generic.IEnumerable<T> deyim bloğu yürütür:

var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibNumbers)
{
    Console.Write($"{element} ");
}
// Output:
// 0 1 1 2 3 5 8 13

deyimi foreach bu türlerle sınırlı değildir. Bunu aşağıdaki koşulları karşılayan herhangi bir tür örneğiyle kullanabilirsiniz:

  • Bir tür, genel parametresiz GetEnumerator yöntemine sahiptir. C# 9.0 ile başlayarak yöntemi bir türün GetEnumeratoruzantı yöntemi olabilir.
  • yönteminin GetEnumerator dönüş türü public Current özelliğine ve dönüş türü boololan public parametresiz MoveNext yöntemine sahiptir.

Aşağıdaki örnekte, türün foreachSystem.Span<T> bir örneğiyle deyimi kullanılır ve bu örnekte arabirim uygulanmaz:

Span<int> numbers = new int[] { 3, 14, 15, 92, 6 };
foreach (int number in numbers)
{
    Console.Write($"{number} ");
}
// Output:
// 3 14 15 92 6

Numaralandırıcının Current özelliği bir başvuru dönüş değeri döndürürse (ref Tburada T bir koleksiyon öğesinin türüdür), aşağıdaki örnekte gösterildiği gibi veya ref readonly değiştiricisi ref ile bir yineleme değişkeni bildirebilirsiniz:

Span<int> storage = stackalloc int[10];
int num = 0;
foreach (ref int item in storage)
{
    item = num++;
}
foreach (ref readonly var item in storage)
{
    Console.Write($"{item} ");
}
// Output:
// 0 1 2 3 4 5 6 7 8 9

foreach deyimi uygulamasına uygulanırsanull, bir NullReferenceException oluşturulur. deyiminin foreach kaynak koleksiyonu boşsa, deyiminin foreach gövdesi yürütülür ve atlanır.

await foreach

zaman uyumsuz bir veri akışı, yani arabirimini uygulayan koleksiyon türünü kullanmak için deyimini IAsyncEnumerable<T> kullanabilirsinizawait foreach. Bir sonraki öğe zaman uyumsuz olarak alınırken döngünün her yinelemesi askıya alınabilir. Aşağıdaki örnekte deyiminin nasıl kullanılacağı gösterilmektedir await foreach :

await foreach (var item in GenerateSequenceAsync())
{
    Console.WriteLine(item);
}

Deyimini await foreach aşağıdaki koşulları karşılayan herhangi bir türün örneğiyle de kullanabilirsiniz:

  • Bir tür, genel parametresiz GetAsyncEnumerator yöntemine sahiptir. Bu yöntem bir türün uzantı yöntemi olabilir.
  • yönteminin GetAsyncEnumerator dönüş türü public Current özelliğine ve dönüş türü Task<bool>, ValueTask<bool>veya awaiter'ın GetResult yöntemi bir değer döndüren başka bir bool beklenebilir türü olan ortak parametresiz MoveNextAsync yönteme sahiptir.

Varsayılan olarak, akış öğeleri yakalanan bağlamda işlenir. Bağlam yakalamayı devre dışı bırakmak istiyorsanız uzantı yöntemini kullanın TaskAsyncEnumerableExtensions.ConfigureAwait . Eşitleme bağlamları ve geçerli bağlamı yakalama hakkında daha fazla bilgi için bkz. Görev tabanlı zaman uyumsuz düzeni kullanma. Zaman uyumsuz akışlar hakkında daha fazla bilgi için zaman uyumsuz akışlar öğreticisine bakın.

Yineleme değişkeninin türü

Aşağıdaki kodda gösterildiği gibi derleyicinin deyimindeki bir yineleme değişkeninin foreach türünü çıkarmasına izin vermek için anahtar sözcüğünü kullanabilirsiniz:var

foreach (var item in collection) { }

Aşağıdaki kodda gösterildiği gibi bir yineleme değişkeninin türünü de açıkça belirtebilirsiniz:

IEnumerable<T> collection = new T[5];
foreach (V item in collection) { }

Önceki biçimde, bir koleksiyon öğesinin türü T örtük veya açıkça bir yineleme değişkeninin türüne V dönüştürülebilir olmalıdır. açık dönüştürme ile TV çalışma zamanında başarısız olursa deyimi foreach bir InvalidCastExceptionoluşturur. Örneğin, korumalı olmayan bir sınıf türüyse T , V uygulamayan T herhangi bir arabirim türü bile olabilir. Çalışma zamanında, bir koleksiyon öğesinin türü öğesinden T türetilen ve aslında uygulayan Vöğe olabilir. Böyle bir durum söz konusu değilse, bir InvalidCastException oluşturulur.

deyimi do

Belirtilen do Boole ifadesi olarak değerlendirilirken deyimi bir deyimini veya deyim bloğunu trueyürütür. Bu ifade döngünün her yürütülmesinden sonra değerlendirildiğinden, döngü bir do veya daha fazla kez yürütülür. deyimi do , sıfır veya daha fazla kez yürütülen bir while döngüsünden farklıdır.

Aşağıdaki örnekte deyiminin kullanımı gösterilmektedir do :

int n = 0;
do
{
    Console.Write(n);
    n++;
} while (n < 5);
// Output:
// 01234

deyimi while

Belirtilen while Boole ifadesi olarak değerlendirilirken deyimi bir deyimini veya deyim bloğunu trueyürütür. Bu ifade döngünün her yürütülmesinden önce değerlendirildiğinden, döngü while sıfır veya daha fazla kez yürütülür. deyimi while , bir veya daha fazla kez yürütülen do döngüsünden farklıdır.

Aşağıdaki örnekte deyiminin kullanımı gösterilmektedir while :

int n = 0;
while (n < 5)
{
    Console.Write(n);
    n++;
}
// Output:
// 01234

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:

C# 8.0 ve sonraki sürümlere eklenen özellikler hakkında daha fazla bilgi için aşağıdaki özellik teklifi notlarını inceleyin:

Ayrıca bkz.