Yineleme deyimleri (C# Başvurusu)

Aşağıdaki deyimler bir deyimi veya bir deyim bloğunu tekrar tekrar yürütür:

  • for Deyimi: belirtilen bir Boole ifadesi olarak değerlendirirken gövdesini yürütür true .
  • foreach İfade: bir koleksiyonun öğelerini numaralandırır ve onun gövdesini koleksiyonun her öğesi için yürütür.
  • do İfade: gövdesini bir veya daha fazla kez koşullu olarak yürütür.
  • while İfade: gövdesini sıfır veya daha fazla kez koşullu olarak yürütür.

Yineleme ifadesinin gövdesi içinde herhangi bir noktada, Break ifadesini kullanarak döngünün dışına bölebilir veya Continue ifadesini kullanarak döngünün bir sonraki yinelemesine adım aktarabilirsiniz.

forİfade

forDeyimi, belirtilen bir Boole ifadesi olarak değerlendirilen bir deyimi veya bir deyim bloğunu yürütür true . Aşağıdaki örnek, for bir tamsayı sayacı üçten az olduğunda gövdesini yürüten ifadeyi gösterir:

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

Önceki örnekte, ifadesinin öğeleri gösterilmektedir for :

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

    Yukarıdaki ö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ülüp yürütülmeyeceğini belirleyen koşul bölümü. trueVeya yoksa, bir sonraki yineleme yürütülür; Aksi takdirde, döngüden çıkıldı. Koşul bölümü bir Boole ifadesi olmalıdır.

    Yukarıdaki örnekteki koşul bölümü, bir sayaç değerinin üçten az 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ü.

    Yukarıdaki ö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ış şekilde aşağıdaki deyim ifadelerinden sıfır veya daha fazlasını içerebilir:

  • veya gibi ön ek veya sonek artışı ifadesi ++i``i++
  • veya gibi sonek azaltma ifadesi --i``i--
  • atanmış
  • bir yöntemin çağrılması
  • await ifadesi
  • New işlecini kullanarak bir nesne oluşturma

Başlatıcı bölümünde bir döngü değişkeni bildirmezseniz, başlatıcı bölümünde yukarıdaki listeden bir veya daha fazla ifade kullanabilirsiniz. Aşağıdaki örnekte, başlatıcı ve yineleyici bölümlerinin birkaç daha az yaygın kullanımları gösterilmektedir: Başlatıcı bölümünde bir dış değişkene değer atama, başlatıcı ve 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

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

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

foreachİfade

foreachDeyimi, System.Collections.IEnumerable System.Collections.Generic.IEnumerable<T> Aşağıdaki örnekte gösterildiği gibi, veya arabirimini uygulayan tür örneğindeki her öğe için bir deyimi veya bir deyim bloğunu 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

foreachİfade bu türlerle sınırlı değildir. Bunu, aşağıdaki koşullara uyan herhangi bir türde bir örnekle kullanabilirsiniz:

  • Bir türün ortak parametresiz yöntemi vardır GetEnumerator . C# 9,0 ' den başlayarak GetEnumerator Yöntem bir türün genişletme yöntemiolabilir.
  • Metodun dönüş türü, GetEnumerator ortak Current özelliğine ve dönüş türü olan public parametresiz metoda sahiptir MoveNext bool .

Aşağıdaki örnek, foreach System.Span<T> hiçbir arabirim uygulamayan tür örneği ile ifadesini kullanır:

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

C# 7,3 ile başlayarak, Numaralandırıcı Current özelliği bir Başvuru dönüş değeri döndürürse ( ref T burada T bir koleksiyon öğesinin türüdür), ref ref readonly Aşağıdaki örnekte gösterildiği gibi, veya değiştiricisini içeren 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İfade öğesine uygulanırsa null , bir oluşturulur NullReferenceException . Deyimin kaynak koleksiyonu foreach boşsa, foreach deyimin gövdesi yürütülmez ve atlanır.

await foreach

C# 8,0 ' den başlayarak, await foreach zaman uyumsuz bir veri akışını (diğer bir deyişle, arabirimi uygulayan koleksiyon türü) kullanmak için ifadesini kullanabilirsiniz IAsyncEnumerable<T> . Next öğesi zaman uyumsuz olarak alındığında döngünün her yinelemesi askıya alınabilir. Aşağıdaki örnek, ifadesinin nasıl kullanılacağını gösterir await foreach :

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

await foreachAşağıdaki koşullara uyan herhangi bir türdeki örnekle birlikte ifadesini de kullanabilirsiniz:

  • Bir türün ortak parametresiz yöntemi vardır GetAsyncEnumerator . Bu yöntem bir türün genişletme yöntemiolabilir.
  • Metodun dönüş türü, GetAsyncEnumerator ortak Current özelliğine ve dönüş türü olan public parametresiz metoda, MoveNextAsync Task<bool> ValueTask<bool> veya awaiter 'ın GetResult yöntemi bir değer döndüren başka bir awasever türüne sahiptir bool .

Akış öğeleri varsayılan olarak yakalanan bağlamda işlenir. Bağlam yakalamayı devre dışı bırakmak istiyorsanız, TaskAsyncEnumerableExtensions.ConfigureAwait genişletme yöntemini kullanın. Eşitleme bağlamları ve geçerli bağlamı yakalama hakkında daha fazla bilgi için bkz. görev tabanlı zaman uyumsuz modelkullanma. Zaman uyumsuz akışlar hakkında daha fazla bilgi için C# 8,0 'deki yenilikler makalesindeki zaman uyumsuz akışlar bölümüne bakın.

Yineleme değişkeni türü

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

foreach (var item in collection) { }

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

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

Önceki biçimde, T bir koleksiyon öğesinin türü örtük olarak veya V bir yineleme değişkeni türüne açıkça dönüştürülebilir olmalıdır. ' Den açık bir dönüştürme T V çalışma zamanında başarısız olursa, foreach ifade bir oluşturur InvalidCastException . Örneğin, T korumalı olmayan bir sınıf türü ise, V Uygulamasız olsa da herhangi bir arabirim türü olabilir T . Çalışma zamanında, bir koleksiyon öğesinin türü, öğesinden türetilen T ve gerçekten uygulayan bir öğe olabilir V . Böyle bir durum yoksa, bir oluşturulur InvalidCastException .

doİfade

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

Aşağıdaki örnek, ifadesinin kullanımını gösterir do :

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

whileİfade

whileDeyimi, belirtilen bir Boole ifadesi olarak değerlendirilen bir deyimi veya bir deyim bloğunu yürütür true . Bu ifade döngünün her yürütmeden önce değerlendirildiğinden, bir while döngü sıfır veya daha fazla kez yürütülür. Bu, bir veya daha fazla kez yürütülen Do döngüsünden farklıdır.

Aşağıdaki örnek, ifadesinin kullanımını gösterir while :

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

C# dili belirtimi

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

C# 8,0 ve üzeri sürümlerde eklenen özellikler hakkında daha fazla bilgi için aşağıdaki özellik teklifi notlarına bakın:

Ayrıca bkz.