427 Stimmen

Switch-Anweisung fallthrough in C#?

Das Durchfallen von Schaltanweisungen ist einer der Hauptgründe, warum ich persönlich die switch vs. if/else if Konstrukte. Ein Beispiel ist hier angebracht:

static string NumberToWords(int number)
{
    string[] numbers = new string[] 
        { "", "one", "two", "three", "four", "five", 
          "six", "seven", "eight", "nine" };
    string[] tens = new string[] 
        { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" };
    string[] teens = new string[]
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
          "sixteen", "seventeen", "eighteen", "nineteen" };

    string ans = "";
    switch (number.ToString().Length)
    {
        case 3:
            ans += string.Format("{0} hundred and ", numbers[number / 100]);
        case 2:
            int t = (number / 10) % 10;
            if (t == 1)
            {
                ans += teens[number % 10];
                break;
            }
            else if (t > 1)
                ans += string.Format("{0}-", tens[t]);
        case 1:
            int o = number % 10;
            ans += numbers[o];

            break;
        default:
            throw new ArgumentException("number");
    }
    return ans;
}

Die klugen Leute schrecken zurück, weil die string[] s sollten außerhalb der Funktion deklariert werden: Nun, sie sind es, dies ist nur ein Beispiel.

Der Compiler schlägt mit dem folgenden Fehler fehl:

Control cannot fall through from one case label ('case 3:') to another
Control cannot fall through from one case label ('case 2:') to another

Warum? Und gibt es eine Möglichkeit, diese Art von Verhalten zu erreichen, ohne dass man drei if s?

7voto

Biri Punkte 6703

Sie haben dieses Verhalten absichtlich weggelassen, um zu vermeiden, dass es willentlich nicht genutzt wird, aber Probleme verursacht.

Es kann nur verwendet werden, wenn es keine Anweisung im Fallteil gibt, wie z. B.:

switch (whatever)
{
    case 1:
    case 2:
    case 3: boo; break;
}

5voto

Ken Punkte 2064

Sie haben das Verhalten der switch-Anweisung (aus C/Java/C++) für c# geändert. Ich vermute, die Begründung war, dass die Leute den Fall-Through vergessen haben und dadurch Fehler verursacht wurden. In einem Buch habe ich gelesen, dass man goto zum Simulieren verwenden soll, aber das klingt für mich nicht nach einer guten Lösung.

0voto

gm2008 Punkte 4025

switch (C#-Referenz) sagt

C# erfordert das Ende von Schalterabschnitten, einschließlich des letzten Abschnitts,

Sie müssen also auch eine break; zu Ihrem default Abschnitt, andernfalls kommt es zu einem Compilerfehler.

-1voto

Powerlord Punkte 84404

Eine Sprunganweisung wie z. B. ein Break ist nach jedem Case-Block erforderlich, einschließlich des letzten Blocks, unabhängig davon, ob es sich um eine case-Anweisung oder eine Standard Anweisung ist. Mit einer Ausnahme (im Gegensatz zu der C++ switch-Anweisung) unterstützt C# keine einen impliziten Fall-Through von einem Case-Label zu einem anderen. Die einzige Ausnahme ist, wenn eine case-Anweisung keinen Code enthält.

-- C# switch()-Dokumentation

-1voto

Shilpa gulati Punkte 33

Nach jeder Fallanweisung erfordern Pause ou siehe Anweisung, auch wenn es sich um einen Standardfall handelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X