- Artikel
Iterationsanweisungen führen wiederholt einen Befehls- oder Anweisungsblock aus.DerAnweisung für: führt Ihren Körper aus, während ein bestimmter boolescher Ausdruck als bewertet wirdWAHR
.DerForeach Anweisung: Listen Sie die Elemente einer Sammlung auf und führen Sie Ihren Körper für jedes Element der Sammlung aus.DerMaßgeblich do: Führt Ihren Körper bedingt ein oder mehrmals aus.Derwhile-Anweisung: Führen Sie Ihren Körper bedingt Null oder mehrmals.
Zu jedem Zeitpunkt auf dem Körper einer Iterationsanweisung können Sie mittels der Schleife aus der Schleife herauskommenUnterricht brechen. Mit können Sie Schritt für Schritt zur nächsten Iteration der Schleife gelangenFortsetzung der Anweisung.
Anweisungfür
Die Anleitungfür
führt eine Anweisung oder einen Anweisungsblock aus, während ein angegebener boolescher Ausdruck als ausgewertet wirdWAHR
.Das folgende Beispiel zeigt die Anweisungfür
Das betreibt Ihren Körper, während ein ganzer Buchhalter weniger als drei ist:
für (int i = 0; i <3; i ++) {console.write (i);} // output: // 012
Das vorherige Beispiel zeigt die Elemente der Anweisungfür
:
Die SektionStiefel, das läuft nur einmal, bevor er in die Schleife eintritt.Normalerweise wird in diesem Abschnitt eine lokale Schleifenvariable deklariert und initialisiert.Sie können nicht auf die von außerhalb der Anweisung deklarierte Variable zugreifen
für
.Die SektionStartprogrammdes vorherigen Beispiels deklariert und initialisiert eine gesamte Buchhaltervariable:
int i = 0
Die SektionZustandDies bestimmt, ob die nächste Schleife -Iteration ausgeführt werden muss.Wenn bewertet wie
WAHR
Oder es ist nicht vorhanden, die folgende Iteration wird ausgeführt;Ansonsten steigen Sie aus der Schleife.Die SektionZustandEs muss ein boolescher Ausdruck sein.Die SektionZustandÜberprüfen Sie aus dem vorherigen Beispiel, ob ein Zählerwert weniger als drei beträgt:
i <3
Die SektionIterator, das definiert, was nach jeder Iteration des Körpers der Schleife passiert.
Die SektionIteratorDas vorherige Beispiel erhöht den Buchhalter:
i ++
Der Körper der Schleife, eine Anweisung oder ein Anweisungsblock.
Der Iteratorabschnitt kann null oder mehr der folgenden Anweisungsausdrücke enthalten, die durch Comas getrennt sind:
- Ausdruck vonErweiterungvon Präfix oder Suffix wie
++ i
Öi ++
- Ausdruckverringernvon Präfix oder Suffix wie
--ich
Öich--
- Abtretung
- Aufruf einer Methode
- Warten Sie den Ausdruck
- Schaffung eines Objekts durch dieneuer Betreiber.
Wenn Sie im Abschnitt "Initialisierungsabschnitt keine Schleifenvariable" deklarieren, können Sie auch Null oder einige der Ausdrücke der vorherigen Liste des Abschnitts verwenden.Im folgenden Beispiel werden mehrere weniger häufige Verwendungen der Anfangs- und Iteratorabschnitte angezeigt: Weisen Sie im Abschnitt "Initialisierungsabschnitt eine externe Variable" zu einem Wert zu, rufen Sie eine Methode in den Abschnitten für Initialisierungs- und Iterator auf und ändern Sie die Werte von zwei Variablen in Der Iterator -Abschnitt:
int i; int j = 3; für (i = 0, console.writeLine ($ "start: i = {i}, j = {j}"); i
Alle Anweisungsabschnittefür
Sie sind optional.Im Beispiel definiert der folgende Code die Schleifefür
unendlich:
für ( ; ; ){ //...}
Anweisungfür jede
Die Anleitungfür jede
Führen Sie für jedes Element einer Instanz des Typs einen Anweisungs- oder Anweisungsblock aus, der die Schnittstelle implementiertSystem.Collections.IenumerableÖSystem.Collectionss.generic.Ienumerable
var fibnumbers = Neue Liste {0, 1, 1, 2, 3, 5, 8, 13}; foreach (intelement in fibnumbers) {console.write ($ "{{Element}");} // Ausgabe: // 0 1 1 2 3 5 8 13
Die Anleitungfür jede
Es ist nicht auf diese Typen beschränkt.Sie können es mit einer Instanz jeglicher Art verwenden, die den folgenden Bedingungen erfüllt:
- Ein Mann hat die öffentliche Methode
Getenumerator
Keine Parameter.Aus C#9.0 die MethodeGetenumerator
Es kann er seinErweiterungsmethodeeines Mannes. - Die Art des Wertes, der aus der Methode zurückgegeben wurde
Getenumerator
hat öffentliches EigentumAktuell
und die öffentliche MethodeMoveNext
ohne Parameter, deren Rückgabetyp istbool
.
Im folgenden Beispiel wird die Anweisung verwendetfür jede
Mit einer Instanz des TypsSystem.span
Span numbers = new int [] {3, 14, 15, 92, 6}; foreach (int number in nummern) {console.write ($ "{number}");} // output: // 314 15 92 6
Wenn die EigenschaftAktuell
des Enumerators gibt a zurückReferenzwert(Ref t
WoT
Es ist die Art eines Sammelelements), Sie können eine Iterationsvariable mit dem Modifikator deklarierenRef
ÖRef Readonly
, wie im folgenden Beispiel gezeigt:
Span storate = stackalloc int [10]; int num = 0; foreach (ref int item in speicher) {item = num ++;} foreach (ref readonly var item in speicher) {console.write ($ "{item}}");} // Ausgabe: // 0 1 2 3 4 5 6 7 8 9
Wenn die Herkunftssammlung der Anweisungfür jede
ist leer, der Körper des Unterrichtsfür jede
wird nicht ausgeführt und übersprungen. Wenn die Anweisungfür jede
gilt fürNull
, se produzierenNullReferencexception.
warte auf nach
Sie können Anweisungen verwendenwarte auf jeden
Um einen asynchronen Datenfluss zu konsumieren, dh die Art der Sammlung, die die Schnittstelle implementiertIasyncenumerable warte auf nach
:
Warten Sie auf (var item in generateSequenceasync ()) {console.writeLine (item);};}
Sie können auch Anweisungen verwendenwarte auf nach
Mit einer Instanz jeglicher Art, die den folgenden Bedingungen erfüllt:
- Ein Mann hat die öffentliche Methode
GetaSyncenumerator
Keine Parameter.Diese Methode kann die seinErweiterungsmethodeTyp. - Die Art des Wertes, der aus der Methode zurückgegeben wurde
GetaSyncenumerator
hat öffentliches EigentumAktuell
und die öffentliche MethodeMOVENEXTASYNC
Keine Parameter, deren Werttyp zurückgegeben wirdAufgabeAnwesendValuetask , oder jeder andere Typ, der zu erwarten ist, dessen Methode GetResult
Es kehrt auf einen Wert zurückbool
.
Die Sequenzelemente werden standardmäßig im erfassten Kontext verarbeitet.Wenn Sie die Kontextaufnahme deaktivieren möchten, verwenden Sie die ErweiterungsmethodeTaskaSyncenumerableAxextensions.ConfigureAwait.Weitere Informationen zu Synchronisationskontexten und der Erfassung des aktuellen Kontexts finden Sie inVerwenden Sie das asynchrone aufgabenbasierte Modell.Weitere Informationen zu asynchronen Sequenzen finden Sie unterAsynchrone Sequenzen Tutorial.
Art einer Iterationsvariablen
Du kannst den ... benutzenSchlüsselwort varDamit dem Compiler den Typ einer Iterationsvariablen für Anweisungen schließen kannfür jede
, wie im folgenden Code gezeigt:
foreach (var item in collection) {}
Sie können den Typ einer Iterationsvariablen auch explizit angeben, wie im folgenden Code gezeigt:
IEnumerable Sammlung = new t [5]; foreach (v item in collection) {}
In der vorherigen Form der TypT
Von einem Sammelelement muss es in der Lage sein, implizit oder explizit in den Typ umgewandelt zu werdenV
einer Iterationsvariablen.Wenn ein Fehler in einer expliziten Umwandlung von auftrittT
InV
In der Ausführungszeit Anweisungfür jede
produzierenInvalidCastException.Zum Beispiel jaT
Es ist eine Art ungeweihter Klasse,V
Es kann jede Art von Schnittstelle sein, auch eine, dieT
Nicht implementiert.In der Ausführungszeit kann der Typ eines Sammelelements derjenige sein, aus dem abgeleitet istT
Und es impliziert wirklich wirklichV
.Wenn dies nicht der Fall ist, tritt dies aufInvalidCastException.
AnweisungTun
Die AnleitungTun
führt einen Anweisungen oder einen Befehlsblock aus, während ein bestimmter boolescher Ausdruck als bewertet wirdWAHR
. Da dieser Ausdruck nach jeder Ausführung der Schleife ausgewertet wird, handelt es sich um eine SchleifeTun
wird einmal oder mehrmals ausgeführt. SchleifeTun
unterscheidet sich vonbucle während, das wird null oder mehrmals ausgeführt.
Das folgende Beispiel zeigt die Verwendung der AnweisungTun
:
int n = 0; do {console.write (n);n ++;} while (n <5); // Ausgabe: // 01234
Anweisungwährend
Die Anleitungwährend
führt einen Anweisungen oder einen Befehlsblock aus, während ein bestimmter boolescher Ausdruck als bewertet wirdWAHR
. Da dieser Ausdruck vor jeder Ausführung der Schleife ausgewertet wird, handelt es sich um eine Schleifewährend
Es läuft Null oder mehrmals.Schleifewährend
unterscheidet sich vonBucle tun, das wird ein oder mehrmals ausgeführt.
Das folgende Beispiel zeigt die Verwendung von Anweisungen anwährend
:
int n = 0;while (n < 5){ Console.Write(n); n++;}// Ausgabe:// 01234
C# Sprachspezifikation
Weitere Informationen finden Sie in den folgenden Abschnitten derC# Sprachspezifikation:
- Die Anweisung für
- Die foreach-Anweisung
- Die Anweisung
- Während der Anweisung
Weitere Informationen zu den in C#8.0 und nachfolgenden Versionen hinzugefügten Eigenschaften finden Sie in den folgenden Vorschlägen:
- Asynchrone Flüsse (C#8.0)
- Kompatibilität mit Genuumerator -Erweiterungen für Foreach Lokels (C#9.0)
Auch sehen
- C# Referenz
- Verwenden Sie mit Matrices foreach
- Iteratoren