Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Iterációs utasítások –
Iterációs utasítások használatával ismétlődően hajthat végre utasítást vagy 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 feltételesen, egy vagy több alkalommal hajtja végre a kódblokkot. Az while utasítás feltételesen nulla vagy több alkalommal végrehajtja a saját törzsét.
Az iterációs utasítás törzsén belül bármikor kiléphet 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ábacontinue.
A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.
A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.
Jótanács
Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.
A 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ám számláló háromnál kisebb.
for (int i = 0; i < 3; i++)
{
Console.Write(i);
}
// Output:
// 012
Az előző példa bemutatja az utasítás elemeit: for
Az inicializáló szakasz, amely csak egyszer fut, 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
forutasí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 = 0A ciklus következő iterációjának futását meghatározó feltételszakasz . Ha kiértékeli,
truevagy nem jelenik meg, a következő iteráció lefut. Ellenkező esetben a hurok kilép. 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 < 3Az iterátor szakasza határozza meg, 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
++ii++ - előtag vagy postfix decrement kifejezés, például
--ii-- - feladat
- metódus meghívása
-
awaitkifejezés - objektum létrehozása az
newoperá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 for nyilatkozat összes szakasza opcionális. A végtelen ciklust például a for következő kód határozza meg:
for ( ; ; )
{
//...
}
A foreach utasítás
Az foreach utasítás egy utasítást vagy utasításblokkot hajt végre minden elemnél egy példányban, amely a System.Collections.IEnumerable vagy a System.Collections.Generic.IEnumerable<T> interfészt implementálja, 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
GetEnumeratormetódussal rendelkezik. AGetEnumeratormetódus lehet bővítménymetódus. - A
GetEnumeratormetódus visszatérési típusa tartalmazza a nyilvánosCurrenttulajdonságot és a nyilvános, paraméter nélküliMoveNextmetódust, amelynek visszatérési típusabool.
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 Current tulajdonsága 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 ref vagy ref readonly 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 nullrendszer, akkor a rendszer egy NullReferenceException elemet ad vissza.
vár foreach
await foreach Az utasítással aszinkron adatstreamet használhat, vagyis egy olyan gyűjteménytípust, amely implementálja az interfésztIAsyncEnumerable<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 mutatja be, hogyan használható a await foreach utasítás:
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
GetAsyncEnumeratormetódussal rendelkezik. Ez a metódus lehet bővítménytag. - A metódus visszatérési
GetAsyncEnumeratortípusa a nyilvánosCurrenttulajdonság és a nyilvános paraméter nélküliMoveNextAsyncmetó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 adboolvissza.
Alapértelmezés szerint az utasítás a await foreach rögzített környezetben dolgozza fel a streamelemeket. 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
Használja a var kulcsszót , hogy a fordító egy iterációs változó típusát következtethesse az foreach utasításban, ahogy az alábbi kód is mutatja:
foreach (var item in collection) { }
Megjegyzés:
A fordító a deklaráció típusát var null értékű hivatkozástípusként tudja kikövetkeztetni attól függően, hogy a null értékű környezet engedélyezve van-e, é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 a T-ból V-ba futásidőben meghiúsul, a foreach kódutasítás egy InvalidCastException-t dob. 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ó. Futtatáskor a gyűjteményelem típusa lehet az, amely a rendszerből T származik, és ténylegesen megvalósítja Vazt. Ha ez nem így van, megtörténik egy InvalidCastException dobás.
A 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 a ciklus minden végrehajtás után kiértékeli ezt a kifejezést, 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 bemutatja az do utasítás használatát.
int n = 0;
do
{
Console.Write(n);
n++;
} while (n < 5);
// Output:
// 01234
A 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 a ciklus minden végrehajtás előtt kiértékeli ezt a kifejezést, 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 bemutatja az while utasítás használatát.
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:
-
Az
forutasítás -
Az
foreachutasítás -
Az
doutasítás -
Az
whileutasítás -
Hurkok bővítménytámogatása
GetEnumeratorforeach