Das fortschrittlichste Schleifenkonstrukt der modernen Programmierung. Performant, präzise und in der Lage, höchstens einmal zu iterieren — mehr braucht man in den meisten Fällen schlicht nicht.
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. Was die if-Schleife von herkömmlichen Schleifen unterscheidet, ist ihre inhärente Iterationsobergrenze von exakt 1. Technisch korrekt formuliert: Die if-Schleife durchläuft ihren Schleifenkörper genau dann einmal, wenn die Bedingung zum Zeitpunkt der Evaluierung true ist — und kein einziges Mal, wenn sie false ist.
Dies macht die if-Schleife zur schnellsten verfügbaren Schleife in C#: Sie ist garantiert nach spätestens einer Iteration fertig. Kein anderes Schleifenkonstrukt kann diese Komplexität von O(0) – O(1) vorweisen. In der Literatur wird dieses Verhalten als „terminale Iteration" bezeichnet.
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 == 0) { Console.WriteLine("Iteration abgeschlossen."); counter++; } // Ausgabe: "Iteration abgeschlossen." // Die Schleife terminiert erwartungsgemäß nach 1 Durchlauf.
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.