Im Allgemeinen (unter Berücksichtigung aller Sprachen und aller Compiler) kann eine switch-Anweisung manchmal effizienter sein als eine if / else-Anweisung, da es für einen Compiler einfach ist, Sprungtabellen aus switch-Anweisungen zu generieren. Es ist möglich, dasselbe für if / else-Anweisungen zu tun, wenn entsprechende Einschränkungen gegeben sind, aber das ist viel schwieriger.
Im Fall von C # gilt dies auch, jedoch aus anderen Gründen.
Bei einer großen Anzahl von Zeichenfolgen bietet die Verwendung einer switch-Anweisung einen erheblichen Leistungsvorteil, da der Compiler eine Hash-Tabelle verwendet, um den Sprung zu implementieren.
Mit einer kleinen Anzahl von Zeichenfolgen ist die Leistung zwischen den beiden gleich.
Dies liegt daran, dass der C # -Compiler in diesem Fall keine Sprungtabelle generiert. Stattdessen wird MSIL generiert, das IF / ELSE-Blöcken entspricht.
Es gibt eine MSIL-Anweisung "switch statement", die beim Jitting eine Sprungtabelle verwendet, um eine switch-Anweisung zu implementieren. Es funktioniert jedoch nur mit ganzzahligen Typen (diese Frage fragt nach Zeichenfolgen).
Für eine kleine Anzahl von Zeichenfolgen ist es für den Compiler effizienter, IF / ELSE-Blöcke zu generieren, als eine Hash-Tabelle zu verwenden.
Als ich dies ursprünglich bemerkte, ging ich davon aus, dass der Compiler dieselbe Transformation für eine große Anzahl von Zeichenfolgen durchführte, da IF / ELSE-Blöcke mit einer kleinen Anzahl von Zeichenfolgen verwendet wurden.
Das war falsch. 'IMA' war so freundlich, mich darauf aufmerksam zu machen (nun ... er war nicht freundlich, aber er hatte Recht und ich habe mich geirrt, was der wichtige Teil ist)
Ich habe auch eine knochenköpfige Annahme über das Fehlen einer "switch" -Anweisung in MSIL gemacht (ich dachte, wenn es ein switch-Grundelement gibt, warum verwenden sie es nicht mit einer Hash-Tabelle, also darf es kein switch-Grundelement geben. ...). Das war sowohl falsch als auch unglaublich dumm von meiner Seite. Wieder machte mich 'IMA' darauf aufmerksam.
Ich habe die Aktualisierungen hier vorgenommen, da dies der am höchsten bewertete Beitrag und die akzeptierte Antwort ist.
Ich habe es jedoch zum Community-Wiki gemacht, weil ich glaube, ich verdiene die REP nicht, weil ich falsch liege. Wenn Sie eine Chance bekommen, stimmen Sie bitte den Beitrag von 'ima' ab.