Iterációs utasítások – for
, foreach
, do
és while
Az iterációs utasítások ismétlődően hajtanak végre egy utasítást vagy egy utasításblokkot. Az for
utasítás végrehajtja a törzsét, miközben egy megadott logikai kifejezés kiértékeli a következőt true
: . Az foreach
utasítás számba adja a gyűjtemény elemeit, és végrehajtja annak törzsét a gyűjtemény minden eleméhez. Az do
utasítás egy vagy több alkalommal feltételesen végrehajtja a törzsét. Az while
utasítás feltételesen nulla vagy több alkalommal hajtja végre a törzsét.
Az iterációs utasítás törzsén belül bármikor kitörhet a ciklusból az break
utasítás használatával. Az utasítással továbbléphet a ciklus következő iterációjába.continue
Az for
utasítás
Az for
utasítás egy utasítást vagy utasításblokkot hajt végre, miközben egy adott logikai kifejezés kiértékeli a következőt true
: . Az alábbi példa azt az utasítást mutatja be, amely végrehajtja a for
törzsét, míg egy egész számszámláló háromnál kisebb:
for (int i = 0; i < 3; i++)
{
Console.Write(i);
}
// Output:
// 012
Az előző példa az utasítás elemeit for
mutatja be:
Az inicializáló szakasz, amelyet csak egyszer hajt végre, mielőtt belép a hurokba. Ebben a szakaszban általában egy helyi hurokváltozót deklarál és inicializál. A deklarált változó nem érhető el az
for
utasításon kívülről.Az előző példa inicializáló szakasza deklarál és inicializál egy egész számszámláló változót:
int i = 0
Az a feltételszakasz , amely meghatározza, hogy a ciklus következő iterációját végre kell-e hajtani. Ha kiértékeli a
true
következő iterációt, vagy nem jelenik meg, a rendszer végrehajtja a következő iterációt, ellenkező esetben a ciklus ki lesz lépve. A feltételszakasznak logikai kifejezésnek kell lennie.Az előző példában szereplő feltételszakasz ellenőrzi, hogy egy számláló értéke háromnál kisebb-e:
i < 3
Az iterátor szakasz, amely meghatározza, hogy mi történik a hurok törzsének minden egyes végrehajtása után.
Az előző példa iterátor szakasza növeli a számlálót:
i++
A hurok törzse, amelynek utasításnak vagy utasításblokknak kell lennie.
Az iterátorszakasz a következő utasításkifejezések közül nullát vagy többet tartalmazhat vesszővel elválasztva:
- előtag vagy postfix növekményes kifejezés, például
++i
i++
- előtag vagy postfix decrement kifejezés, például
--i
i--
- Hozzárendelés
- metódus meghívása
await
Kifejezés- objektum létrehozása az
new
operátorral
Ha nem deklarál egy hurokváltozót az inicializáló szakaszban, az inicializáló szakaszban az előző lista kifejezéseinek nulla vagy több kifejezését is használhatja. Az alábbi példa az inicializáló és az iterátorszakaszok több kevésbé gyakori használatát mutatja be: érték hozzárendelése egy külső változóhoz az inicializáló szakaszban, metódus meghívása mind az inicializáló, mind az iterátor szakaszokban, valamint két változó értékeinek módosítása az iterátor szakaszban:
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
Az utasítás minden szakasza for
nem kötelező. A végtelen ciklust például a for
következő kód határozza meg:
for ( ; ; )
{
//...
}
Az foreach
utasítás
Az foreach
utasítás egy utasítást vagy utasításblokkot hajt végre egy olyan példány egyes elemeihez, amelyek az interfészt vagy System.Collections.Generic.IEnumerable<T> az System.Collections.IEnumerable interfészt implementálják, ahogy az alábbi példa mutatja:
List<int> fibNumbers = new() { 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
Az foreach
utasítás nem korlátozódik ezekre a típusokra. Bármilyen típusú példánnyal használhatja, amely megfelel a következő feltételeknek:
- Egy típus nyilvános paraméter nélküli
GetEnumerator
metódussal rendelkezik. AGetEnumerator
metódus lehet egy típus bővítménymetódusa. - A metódus visszatérési típusa a
GetEnumerator
nyilvánosCurrent
tulajdonság és a nyilvános paraméter nélküliMoveNext
metódus, amelynek visszatérési típusa .bool
Az alábbi példa az foreach
utasítást egy ilyen típusú példánnyal System.Span<T> használja, amely nem implementál interfészeket:
Span<int> numbers = [3, 14, 15, 92, 6];
foreach (int number in numbers)
{
Console.Write($"{number} ");
}
// Output:
// 3 14 15 92 6
Ha az enumerátor tulajdonsága Current
egy hivatkozási visszatérési értéket ad vissza (ref T
ahol T
a gyűjteményelem típusa), deklarálhat egy iterációs változót a módosítóval vagy ref readonly
a ref
módosítóval, ahogyan az alábbi példa mutatja:
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
Ha az foreach
utasítás forrásgyűjteménye üres, a rendszer nem hajtja végre és nem hagyja ki az foreach
utasítás törzsét. Ha az foreach
utasítást alkalmazza a null
rendszer, akkor a rendszer egy NullReferenceException elemet ad vissza.
vár foreach
Az await foreach
utasítással aszinkron adatstreamet használhat, vagyis azt a gyűjteménytípust, amely megvalósítja az interfészt IAsyncEnumerable<T> . A ciklus minden iterációja felfüggeszthető, amíg a következő elem aszinkron módon lesz lekérve. Az alábbi példa az utasítás használatát await foreach
mutatja be:
await foreach (var item in GenerateSequenceAsync())
{
Console.WriteLine(item);
}
Az utasítást await foreach
bármilyen típusú példánnyal is használhatja, amely megfelel a következő feltételeknek:
- Egy típus nyilvános paraméter nélküli
GetAsyncEnumerator
metódussal rendelkezik. Ez a metódus lehet egy típus bővítménymetódusa. - A metódus visszatérési
GetAsyncEnumerator
típusa a nyilvánosCurrent
tulajdonság és a nyilvános paraméter nélküliMoveNextAsync
metódus, amelynek visszatérési típusaTask<bool>
,ValueTask<bool>
vagy bármely más olyan várható típus, amelynek a váró metódusaGetResult
értéket adbool
vissza.
Alapértelmezés szerint a streamelemek feldolgozása a rögzített környezetben történik. Ha le szeretné tiltani a környezet rögzítését, használja a TaskAsyncEnumerableExtensions.ConfigureAwait bővítménymetódust. A szinkronizálási környezetekről és az aktuális környezet rögzítéséről további információt a Tevékenységalapú aszinkron minta felhasználása című témakörben talál. Az aszinkron streamekről további információt az Aszinkron streamek oktatóanyagában talál.
Iterációs változó típusa
A kulcsszóval var
a fordító az utasításban foreach
lévő iterációs változó típusát is kikövetkeztetheti, ahogy az alábbi kód is mutatja:
foreach (var item in collection) { }
Feljegyzés
A fordító az inicializálási kifejezés típusától var
függően null értékű hivatkozástípusként is kikövetkeztethető attól függően, hogy engedélyezve van-e a null értékű környezet , és hogy az inicializálási kifejezés típusa hivatkozástípus-e.
További információ: Implicit típusú helyi változók.
Explicit módon megadhatja az iterációs változó típusát is, ahogy az alábbi kód is mutatja:
IEnumerable<T> collection = new T[5];
foreach (V item in collection) { }
Az előző formában a gyűjteményelem típusának T
implicit módon vagy explicit módon konvertálhatónak kell lennie egy iterációs változó típusára V
. Ha egy explicit átalakítás T
V
futásidőben meghiúsul, az foreach
utasítás egy InvalidCastException. Ha például T
egy nem lezárt osztálytípus, V
akkor bármilyen interfésztípus lehet, még az is, amelyik T
nem implementálható. Futásidőben a gyűjteményelem típusa lehet az, amely a rendszerből T
származik, és ténylegesen megvalósítja azt V
. Ha ez nem így van, egy InvalidCastException dobás.
Az do
utasítás
Az do
utasítás egy utasítást vagy utasításblokkot hajt végre, miközben egy adott logikai kifejezés kiértékeli a következőt true
: . Mivel ez a kifejezés a ciklus minden végrehajtása után kiértékelésre kerül, egy do
ciklus egy vagy több alkalommal hajtja végre. A do
hurok eltér a while
huroktól, amely nullát vagy több alkalommal hajt végre.
Az alábbi példa az utasítás használatát do
mutatja be:
int n = 0;
do
{
Console.Write(n);
n++;
} while (n < 5);
// Output:
// 01234
Az while
utasítás
Az while
utasítás egy utasítást vagy utasításblokkot hajt végre, miközben egy adott logikai kifejezés kiértékeli a következőt true
: . Mivel ez a kifejezés a ciklus minden végrehajtása előtt kiértékelésre kerül, egy while
ciklus nullát vagy több alkalommal hajt végre. A while
hurok eltér a do
huroktól, amely egy vagy több alkalommal hajt végre.
Az alábbi példa az utasítás használatát while
mutatja be:
int n = 0;
while (n < 5)
{
Console.Write(n);
n++;
}
// Output:
// 01234
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:
További információ ezekről a funkciókról:
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: