Auswahlanweisungen : if, else und switch

Die ifAnweisungen , else und switch wählen Anweisungen aus, die basierend auf dem Wert eines Ausdrucks aus vielen möglichen Pfaden ausgeführt werden sollen. Die if-Anweisung wählt eine -Anweisung aus, die basierend auf dem Wert eines booleschen Ausdrucks ausgeführt werden soll. Eine if -Anweisung kann mit else kombiniert werden, um basierend auf dem booleschen Ausdruck zwei unterschiedliche Pfade auszuwählen. Die switchAnweisung wählt eine Anweisungsliste aus, die basierend auf einer Mustervergleichung mit einem Ausdruck ausgeführt werden soll.

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 (verfügbar in C# 9.0 und höher): zum Vergleichen eines Ausdrucksergebnisses mit einer Konstante.
  • Ein konstantes Muster: Test, ob ein Ausdrucksergebnis einer Konstante 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 Übereinstimmungsausdruck keinem Fallmuster entspricht und keine default Groß-/Kleinschreibung vorliegt, durchläuft das Steuerelement 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 immer zuletzt und nur ausgewertet, wenn alle anderen Fallmuster nicht übereinstimmen, außer wenn goto default gefunden 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 das Steuerelement nicht von einem Switchabschnitt zum nächsten fallen. 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 zur Musterabgleichsanweisung switch finden Sie in den folgenden Anmerkungen zu Featurevorschlägen:

Weitere Informationen