In Programmiersprachen haben switch-Anweisungen eine ehrwürdige Geschichte. Sie wurden in C eingeführt, wo man sie für ihre Geschwindigkeit schätzte. Diese Geschwindigkeit ging auf Kosten der Funktionalität, die stark eingeschränkt war. In C# wurde die Rolle der switch-Anweisung über Ganzzahlen hinaus erweitert. switch-Anweisungen können beliebige Typen, Werte oder Referenzen umfassen.
Wenn du aus einer funktionalen Sprache kommst, ist die Arbeit mit switch-Anweisungen (und switch-Ausdrücken, die an anderer Stelle besprochen werden) das, was in C# der Verwendung von diskriminierten Unions und Pattern Matching am nächsten kommt. Allerdings kommen sie bei Weitem nicht an die Fähigkeit diskriminierter Unions heran, Typsicherheit zu erzwingen.
Einfache switch-Anweisungen ähneln ihren C-Vorfahren: Sie kombinieren switch, case, break und default.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
Das obige Muster lässt sich mit jedem einfachen Typ (Primitive und Strings) verwenden.
Wenn Referenztypen mit ins Spiel kommen, ist zusätzliche Syntax nötig, zuerst um den Typ herunterzucasten und dann um Guards (when) hinzuzufügen, obwohl Guards auch bei einfachen Werten verwendet werden können. Das folgende Beispiel veranschaulicht das:
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default-Klausel ist optional, aber in der Regel wünschenswert.break-Anweisung ist für jede nicht leere case-Klausel obligatorisch.case-Labels vom Typ des switch-Arguments ableiten. Ein switch-Argument vom Typ Object erlaubt offensichtlich die größte Bandbreite.case-Arguments.case mit unterschiedlichen case-Argumenten können sich auf denselben Block beziehen.Die Dokumentation zur switch-Anweisung bietet eine Einführung in switch-Anweisungen.