Unterschiede zwischen den Anweisungen Select Case
und switch
Die bekanntesten Programmiersprachen zur Entwicklung für das .NET Framework bieten eigene Anweisungen zur Verzweigung an, die über die von If
gebotenen Möglichkeiten hinausgehen. In Visual Basic .NET steht zur Verzweigung die Anweisung Select Case
, in C# switch
zur Verfügung. Auf den ersten Blick scheinen beide Anweisungen hinsichtlich ihrer Funktionalität ungefähr ebenbürtig, bei genauerer Betrachtung können jedoch einige wichtige Unterschiede in Funktionsumfang und Verhalten der Anweisungen festgestellt werden, deren Beschreibung sich dieser Artikel widmet. Diese Unterschiede sind, insbesondere bei der Anweisung switch
in C#, historisch bedingt. Syntax und Semantik von Select Case
in Visual Basic .NET wurden weitgehend aus Visual Basic 6.0 übernommen. switch
in C# hingegen ist der gleichnamigen Anweisung aus C nachempfunden.
-
Bei
Select Case
können mehrere Bedingungen in einemCase
-Zweig zusammengefaßt werden (Case 1, 7, 12, 43
), beiswitch
ist dies nicht möglich. Durch das Zusammenfassen mehrerer Zweige in einem wird die Lesbarkeit des Codes erhöht, indem die Übersicht gefördert wird und Codesegmente nicht dupliziert werden müssen. In C war ein ähnliches Verhalten erzielbar, indem mehrerecase
-Zweige ohnebreak
-Anweisung spezifiziert wurden. Diese Möglichkeit des „Durchfallens“ besteht in C# jedoch ebenfalls nicht, dabreak
zwingend angegeben werden muß. Stattdessen können entweder mehrerecase
-Zweige direkt hintereinander notiert oder die Ausführung kann explizit mittelsgoto case
an weitere Zweige übertragen werden;break
kann in hierbei entfallen. -
Der Datentyp, anhand von dessen Werten verzweigt wird, muß die Definition konstanter Werte zulassen. Daher ist keine Verzweigung anhand von Instanzen eines beliebigen Datentyps möglich.
switch
kann daher nur für numerische Datentypen, Aufzählungstypen und den Datentypstring
genutzt werden. Das Verzweigen anhand von nicht-konstanten Objekten, wie sie etwa in Aufzählungen wieColor
,Pens
undBrushes
vorkommen, wird damit nicht unterstützt. Anstatt vonswitch
muß in diesen Fällen aufif
-Anweisungen mit mehrerenelse if
-Zweigen zurückgegriffen werden. Außerdem können beiSelect Case
nahezu beliebige Auswahlbedingungen angegeben werden: -
Ein weiterer Unterschied besteht in den Gültigkeitsbereichen, die durch die Zweige der Auswahlanweisungen
Select Case
undswitch
aufgespannt werden.Case
-Zweige definieren einen eigenen Gültigkeitsbereich. Deshalb ist es möglich, Variablen gleichen Namens in mehreren Zweigen zu deklarieren, wie dies auch bei derIf
-Anweisung inElse If
-Blöcken möglich ist. Dagegen stellt der Bereich zwischencase
undbreak
beiswitch
nicht automatisch einen Gültigkeitsbereich dar. Ein solcher müßte bei Bedarf explizit über geschweifte Klammern definiert werden. Das weitaus sauberere Entfernen der Anweisungbreak
bei gleichzeitiger impliziter Beendigung der Überprüfung der Bedingungen voncase
-Zweigen wurde mit der Begründung nicht vorgenommen, daß C++-Entwickler dadurch verunsichert würden, wenn sichswitch
in C++ und C# voneinander unterscheiden würden:Der zweiten
switch
-Anweisung im vorigen Listing gilt dabei besondere Aufmerksamkeit. Die im erstencase
-Zweig deklarierte lokale Variableb
steht auch in den nachfolgendencase
-Zweigen zur Verfügung; die Deklaration einer Variablen mit gleichem Namen ist daher nicht möglich, ohne einen weiteren Block einzuführen. Dies ist unintuitiv, da die Deklaration, so man sie als Anweisung interpretiert, nicht ausgeführt werden sollte, wenn die Bedingung des erstencase
-Zweigs nicht erfüllt ist. Letzteres muß zwingend der Fall sein, wenn der Code im zweitencase
-Zweig zur Ausführung gelangt. Ersetzt man diebreak
-Anweisung im erstencase
-Zweig durch die Anweisunggoto case 2
sowieb = a + 3
durcha = b + 3
, wird weiterhin der Compilerfehler Use of unassigned variable 'b' ausgelöst! Folgendes Listing zeigt kompilierbaren Code in Visual Basic .NET, bei dem Variablen gleichen Namens in mehrerenCase
-Zweigen deklariert werden: -
Anders als bei
Select Case
stellen die konstanten Ausdrücke, anhand derer verzweigt wird, in C# gleichzeitig Sprungziele dar, auf die von anderencase
-Zweigen heraus mitgoto case constant-expression
gesprungen werden kann. Eine exakte Duplizierung eines bestehenden konstanten Ausdrucks, der in einemcase
-Zweig benutzt wird, ist dabei nicht erforderlich; lediglich der Wert des Ausdrucks muß gleich sein. In Visual Basic .NET läßt sich ein ähnliches Verhalten durch Verwendung benannter oder unbenannter Sprungmarken vor den jeweiligenCase
-Zweigen erzielen, die mittels der AnweisungGoTo
angesprungen werden können. Wenngleich letztere Variante nicht so fest in die Syntax der Programmiersprache integriert ist, wie dies beiswitch
der Fall zu sein scheint, bietet sie zumindest die Möglichkeit der ausdrucksstarken Benennung der Sprungmarken.