none
Switch und kein Ende RRS feed

  • 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

    Freitag, 24. Mai 2013 16:09
    Moderator

Alle Antworten

  • Hi Marcel,

    was gibt es denn zu gewinnen...;)

    ...auf den ersten Blick würde ich sagen... diese switch Anweisung verdient den Beamtenstatus. Sie sorgt dafür, dass sie zwar immer irgendwie beschäftigt wirkt, wenn auch nur mit sich selbst...;)

    Samstag, 25. Mai 2013 12:16
  • 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

    Samstag, 25. Mai 2013 13:25
    Moderator
  • 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
    Sonntag, 26. Mai 2013 04:54
  • 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

    Sonntag, 26. Mai 2013 07:05
    Moderator