Auswahlanweisungen: if, if-else und switch

Mit den Anweisungen if, if-else und switch werden Anweisungen aus vielen möglichen Pfaden basierend auf dem Wert eines Ausdrucks zur Ausführung ausgewählt. Die if-Anweisung führt eine Anweisung nur dann aus, wenn ein bereitgestellter boolescher Ausdruck als true ausgewertet wird. Mit der if-else-Anweisung können Sie basierend auf einem booleschen Ausdruck auswählen, welcher der beiden Codepfade ausgeführt werden soll. Die switch-Anweisung wählt eine Anweisungsliste basierend auf einer Musterübereinstimmung mit einem Ausdruck zur Ausführung aus.

Die Anweisung if

Eine if-Anweisung kann eine der folgenden beiden Formen haben:

  • Eine if-Anweisung mit einem else-Teil wählt eine der beiden auszuführenden Anweisungen basierend auf dem Wert eines booleschen Ausdrucks aus, wie im folgenden Beispiel gezeigt:

    DisplayWeatherReport(15.0);  // Output: Cold.
    DisplayWeatherReport(24.0);  // Output: Perfect!
    
    void DisplayWeatherReport(double tempInCelsius)
    {
        if (tempInCelsius < 20.0)
        {
            Console.WriteLine("Cold.");
        }
        else
        {
            Console.WriteLine("Perfect!");
        }
    }
    
  • Eine if-Anweisung ohne else-Teil führt ihren Text nur aus, wenn ein boolescher Ausdruck als true ausgewertet wird, wie im folgenden Beispiel gezeigt:

    DisplayMeasurement(45);  // Output: The measurement value is 45
    DisplayMeasurement(-3);  // Output: Warning: not acceptable value! The measurement value is -3
    
    void DisplayMeasurement(double value)
    {
        if (value < 0 || value > 100)
        {
            Console.Write("Warning: not acceptable value! ");
        }
    
        Console.WriteLine($"The measurement value is {value}");
    }
    

Sie können if-Anweisungen schachteln, um mehrere Bedingungen zu überprüfen, wie im folgenden Beispiel gezeigt:

DisplayCharacter('f');  // Output: A lowercase letter: f
DisplayCharacter('R');  // Output: An uppercase letter: R
DisplayCharacter('8');  // Output: A digit: 8
DisplayCharacter(',');  // Output: Not alphanumeric character: ,

void DisplayCharacter(char ch)
{
    if (char.IsUpper(ch))
    {
        Console.WriteLine($"An uppercase letter: {ch}");
    }
    else if (char.IsLower(ch))
    {
        Console.WriteLine($"A lowercase letter: {ch}");
    }
    else if (char.IsDigit(ch))
    {
        Console.WriteLine($"A digit: {ch}");
    }
    else
    {
        Console.WriteLine($"Not alphanumeric character: {ch}");
    }
}

In einem Ausdruckskontext können Sie mit dem bedingten Operator ?: einen der beiden Ausdrücke auf dem Wert eines booleschen Ausdrucks basierend auswerten.

Die Anweisung switch

Die switch-Anweisung wählt eine Anweisungsliste basierend auf einer Musterübereinstimmung mit einem Vergleichsausdruck zur Ausführung aus, wie das folgende Beispiel zeigt:

DisplayMeasurement(-4);  // Output: Measured value is -4; too low.
DisplayMeasurement(5);  // Output: Measured value is 5.
DisplayMeasurement(30);  // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN);  // Output: Failed measurement.

void DisplayMeasurement(double measurement)
{
    switch (measurement)
    {
        case < 0.0:
            Console.WriteLine($"Measured value is {measurement}; too low.");
            break;

        case > 15.0:
            Console.WriteLine($"Measured value is {measurement}; too high.");
            break;

        case double.NaN:
            Console.WriteLine("Failed measurement.");
            break;

        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

Im vorherigen Beispiel nutzt eine switch-Anweisung die folgenden Muster:

  • Ein relationales Muster: um ein Ausdrucksergebnis mit einer Konstante zu vergleichen.
  • Ein Konstantenmuster: um zu testen, ob ein Ausdrucksergebnis einer Konstanten entspricht.

Wichtig

Informationen zu den von der switch-Anweisung unterstützten Mustern finden Sie unter Muster.

Im vorherigen Beispiel wird auch der default-Fall veranschaulicht. Der default-Fall gibt Anweisungen an, die ausgeführt werden, wenn ein Vergleichsausdruck nicht mit einem anderen Fallmuster übereinstimmt. Wenn ein Vergleichsausdruck keinem Fallmuster entspricht und kein default-Fall vorliegt, verlässt die Steuerung eine switch-Anweisung.

Eine switch-Anweisung führt die Anweisungsliste im ersten Switch-Abschnitt aus, dessen Fallmuster mit einem Vergleichsausdruck übereinstimmt und dessen Case Guard (falls vorhanden) als ausgewertet true wird. Eine switch-Anweisung wertet Fallmuster in Textreihenfolge von oben nach unten aus. Der Compiler generiert einen Fehler, wenn eine switch-Anweisung einen nicht erreichbaren Fall enthält. Dies ist ein Fall, der bereits von einem übergeordneten Fall behandelt wird, oder dessen Muster nicht übereinstimmen kann.

Hinweis

Der default-Fall kann an beliebiger Stelle in der switch-Anweisung auftreten. Unabhängig von seiner Position wird der default-Fall nur ausgewertet, wenn keine anderen Groß- und Kleinschreibungsmuster übereinstimmen oder die goto default;-Anweisung in einem der switch-Abschnitte ausgeführt wird.

Sie können mehrere Fallmuster für einen Abschnitt einer switch-Anweisung angeben, wie im folgenden Beispiel gezeigt:

DisplayMeasurement(-4);  // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50);  // Output: Measured value is 50.
DisplayMeasurement(132);  // Output: Measured value is 132; out of an acceptable range.

void DisplayMeasurement(int measurement)
{
    switch (measurement)
    {
        case < 0:
        case > 100:
            Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
            break;
        
        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

Innerhalb einer switch-Anweisung kann die Steuerung nicht von einem Switch-Abschnitt zum nächsten wechseln. Wie die Beispiele in diesem Abschnitt zeigen, verwenden Sie die break-Anweisung in der Regel am Ende jedes Switch-Abschnitts, um die Steuerung aus einer switch-Anweisung heraus zu übergeben. Sie können auch die Anweisungen return und throw verwenden, um die Steuerung aus einer switch-Anweisung heraus zu übergeben. Um das Verhalten beim Verlassen zu imitieren und die Steuerung an einen anderen Switch-Abschnitt zu übergeben, können Sie die goto-Anweisung verwenden.

In einem Ausdruckskontext können Sie den switch-Ausdruck verwenden, um einen einzelnen Ausdruck aus einer Liste mit möglichen Ausdrücken auf Grundlage eines Musterabgleichs mit einem Ausdruck auszuwerten.

Case Guards

Ein Fallmuster ist möglicherweise nicht ausdrucksstark genug, um die Bedingung für die Ausführung des Switch-Abschnitts anzugeben. In so einem Fall können Sie einen Case Guard verwenden. Dabei handelt es sich um eine zusätzliche Bedingung, die zusammen mit einem übereinstimmenden Muster erfüllt werden muss. Ein Case Guard muss ein boolescher Ausdruck sein. Sie geben einen Case Guard nach dem when-Schlüsselwort an, das einem Muster folgt. Sehen Sie sich dazu das folgende Beispiel an:

DisplayMeasurements(3, 4);  // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5);  // Output: Both measurements are valid and equal to 5.

void DisplayMeasurements(int a, int b)
{
    switch ((a, b))
    {
        case (> 0, > 0) when a == b:
            Console.WriteLine($"Both measurements are valid and equal to {a}.");
            break;

        case (> 0, > 0):
            Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
            break;

        default:
            Console.WriteLine("One or both measurements are not valid.");
            break;
    }
}

Im vorherigen Beispiel werden Positionsmuster mit geschachtelten relationalen Mustern verwendet.

C#-Sprachspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:

Weitere Informationen zu Mustern finden Sie im Abschnitt Muster und Musterabgleich der C#-Sprachspezifikation.

Weitere Informationen