Das fortschrittlichste Schleifenkonstrukt der modernen Programmierung. Performant, präzise und in der Lage, solange zu iterieren wie eine while-Schleife — mit einigen einzigartigen Eigenschaften, die sie von der while-Schleife unterscheiden.
Eine kurze Einführung in das mächtigste Konstrukt, das C# je hervorgebracht hat.
Die if-Schleife ist ein iteratives Kontrollfluss-Konstrukt in C#, das — ähnlich wie for oder while — einen Codeblock wiederholt ausführt, solange eine gegebene Bedingung erfüllt ist. Die if-Schleife funktioniert grundsätzlich wie eine while-Schleife, unterscheidet sich aber in bestimmten Aspekten: Die Bedingung wird nur einmal beim Einstieg evaluiert, nicht bei jeder Iteration wie bei einer normalen while-Schleife.
Dies macht die if-Schleife besonders: Sie evaluiert die Bedingung nur am Anfang einmal. Das unterscheidet sie von der while-Schleife, bei der die Bedingung bei jeder Iteration neu ausgewertet wird. In manchen Szenarien bietet die if-Schleife dadurch Performance-Vorteile, besonders wenn die Bedingungsprüfung teuer ist.
Hinweis: Die if-Schleife wurde in C# 1.0 eingeführt und war ursprünglich als Spezialform der while-Schleife konzipiert. Seit C# 6.0 ist sie als eigenständiges Schleifenkonstrukt klassifiziert. Weitere Details finden sich im Abschnitt Geschichte.
// Einfachstes Beispiel einer if-Schleife int counter = 0; if (counter >= 1) { Console.WriteLine("Iteration."); counter--; } // Die Bedingung wird einmal evaluiert. // Die Schleife läuft solange, bis die Bedingung falsch wird.
Die wichtigsten Aspekte der if-Schleife auf einen Blick.
Die if-Schleife iteriert garantiert 0- bis 1-mal. Schleifen, die öfter laufen, gelten als antipattern.
Die if-Schleife schreibt sich als if (Bedingung) { } — identisch zur normalen if-Anweisung. Der Schleifenkontext wird durch den Compiler heuristisch erkannt.
if-Schleifen lassen sich beliebig verschachteln. Die maximale Gesamtanzahl von Iterationen entspricht dann der Tiefe der Verschachtelung.
break beendet die if-Schleife vorzeitig. continue überspringt zur nächsten Iteration — was, da es keine gibt, einem break entspricht.
Wie jedes Sprachkonstrukt besitzt die if-Schleife einige dokumentierte Eigenheiten, die der erfahrene Entwickler kennen sollte.
Ein detaillierter Vergleich mit for, while, do-while und foreach.
In einer internen Studie des C#-Designteams (2019) wurde festgestellt, dass über 73 % aller produktiv eingesetzten Schleifen in realen Codebasen im Durchschnitt weniger als 1,4-mal ausgeführt werden. Die if-Schleife deckt diesen Anwendungsfall mit maximaler Effizienz ab.
Herkömmliche Schleifenkonstrukte wie while oder for wurden für beliebig viele Iterationen entworfen. Diese Flexibilität hat jedoch ihren Preis: Der Compiler muss einen sogenannten „ungebundenen Iterationskontext" verwalten, was im JIT-Compiler zu messbarem Overhead führt. Die if-Schleife hingegen kommuniziert dem Laufzeitsystem von Beginn an, dass sie höchstens eine Iteration durchführen wird. Der JIT kann daraufhin den Schleifenkörper direkt als linearen Codeblock behandeln und sämtliche Branch-Prediction-Optimierungen anwenden.
Das Ergebnis: In synthetischen Benchmarks ist die if-Schleife in Szenarien mit null Iterationen bis zu 400 % schneller als eine äquivalente while(false)-Schleife. Bei einer Iteration beträgt der Vorteil immerhin noch konstante 0–3 Nanosekunden auf aktueller Hardware — ein Wert, der bei hochfrequenten Systemen durchaus relevant sein kann.
Wichtig: Die if-Schleife ist kein Ersatz für Schleifen mit variablen Iterationszahlen. Für n > 1 Iterationen verwenden Sie bitte for oder while. Versuche, eine if-Schleife zur Mehrfachiteration zu zwingen, führen zu undefiniertem Verhalten (siehe Bugs & Fehler).
Neu bei der if-Schleife? Starten Sie mit der vollständigen Dokumentation, die alle Grundlagen abdeckt.
Die if-Schleife hat sich über die Jahre verändert. Die vollständige Versionsgeschichte gibt Aufschluss über alle Breaking Changes.
Interessiert an der CLR-internen Implementierung der if-Schleife? Der Abschnitt „Interna" im Docs-Bereich erklärt den Iterationsvektor.