Fragensteller
Switch und kein Ende

Allgemeine Diskussion
-
Liebe Community,
die switch-Anweisung gehört zu den ersten Anweisungen, die man in C# erlernt, bietet sie doch eine optisch elegante und ökonomische Möglichkeit dar, aus einer Liste von Kandidaten auszuwählen.
Daher dachte auch ich, nichts einfacher als eine switch-Anweisung. Ihr werdet euch erinnern, dass jeder case-Abschnitt einer switch-Anweisung mit einer jump-artigen Anweisung enden muss. Normalerweise endet ein case-Abschnitt mit break, möglich sind aber auch: goto case [x], goto default oder aber return, throw, continue und goto [Label].
Kompliziert wird's, wenn man alles zusammennimmt. Es folgt ein Stück Code zum Kopfschütteln und Wundern:
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { new Program().Test(); Console.WriteLine("Beliebige Taste drücken."); Console.ReadKey(true); } private void Test() { var numbers = new[] { 1, 2, 3, 4 }; for (int idx = 0; idx < numbers.Length; idx++) { var number = numbers[idx]; rewind: try { switch (number) { case 1: while (true) { goto default; }; case 2: goto case 1; case 3: case 4: Array.Resize(ref numbers, numbers.Length + 1); continue; default: throw new Exception(); } } catch (Exception ex) { number++; goto rewind; } } } } }
Ihr werdet es nicht glauben, dass ich ähnlichen Code heute debuggen mußte.
Die Preisfrage: Könnt ihr beim bloßen Lesen sagen, was der Code macht?
Gruß
Marcel
Alle Antworten
-
Hi Ralf,
wirklich schön formuliert! Ja, der Schlaf der Vernunft gebiert Ungeheuer. Zu gewinnen ist vielleicht die Einsicht warum die Väter von C# kein "Durchrutschen" von case-Blocks in der Sprache erlaubt haben und wieviel das Wert ist, wenn man Tools wie Endlosschleifen, goto und continue hat. Vielleicht auch ein gewisses Gefühl der Erleichterung nächstes Mal wenn dich der Compiler an ein vergessenes "break" erinnert (ich vergesse die schon ab und zu ;-).
Schöne Grüße
Marcel -
Ja also das verwundert mich auch ein wenig... In mein momentanen Project meckert der Compiler immer wenn ich kein break da am ende jedes cases da stehen habe...
Zur funktion: Beim Überfliegen dachte ich es sei ein Arraygrößen modifizierer.... Für was das auch immer gut sein soll....
bezgl der breaks die ich auch immer vergesse es gibt einige tools (z.b. visual assist x) die nehmen einen solch lästige arbeit ab...- Bearbeitet Brian Dahl Sonntag, 26. Mai 2013 04:55
-
Hallo Brian,
Beim Überfliegen dachte ich es sei ein Arraygrößen modifizierer.... Für was das auch immer gut sein soll...
Ja, hätte sein können. Der Code ist ein winzig kleiner Ausschnitt aus einer umfangreichen Codebasis, die sich der control flow obfuscation widmete (und am Ende so sehr obfuskierte, dass keiner mehr genau sagen konnte, was der Code wirklich tat).
Gruß
Marcel