Freigeben über


Selection-Anweisungen - if, if-elseund switch

Mit den ifAnweisungen werden switch Anweisungen ausgewählt, if-else die anhand des Werts eines Ausdrucks aus vielen möglichen Pfaden ausgeführt werden sollen. Die if Anweisung führt eine Anweisung nur aus, wenn ein bereitgestellter boolescher Ausdruck ausgewertet wird true. Mit der if-else Anweisung können Sie auswählen, welche der beiden Codepfade basierend auf einem booleschen Ausdruck folgen sollen. Die switch Anweisung 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 sein:

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

    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 einen else Teil führt ihren Text nur aus, wenn ein boolescher Ausdruck ausgewertet wird true, 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 Anweisungen verschachteln if , um mehrere Bedingungen zu überprüfen, wie das folgende Beispiel zeigt:

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 den bedingten Operator ?: verwenden, um einen der beiden Ausdrücke basierend auf dem Wert eines booleschen Ausdrucks auszuwerten.

Die Anweisung switch

Die switch Anweisung wählt eine Anweisungsliste aus, die basierend auf einer Mustervergleich mit einem Übereinstimmungsausdruck ausgeführt werden soll, 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 verwendet die switch Anweisung die folgenden Muster:

Von Bedeutung

Informationen zu den mustern, die von der switch Anweisung unterstützt werden, finden Sie unter Patterns.

Im vorherigen Beispiel wird auch der default Fall veranschaulicht. Der default Fall gibt Anweisungen an, die ausgeführt werden sollen, wenn ein Übereinstimmungsausdruck keinem anderen Fallmuster entspricht. Wenn ein Übereinstimmungsausdruck keinem Fallmuster entspricht und kein default Fall vorhanden ist, fällt das Steuerelement durch eine switch Anweisung.

Eine switch Anweisung führt die Anweisungsliste im ersten Switch-Abschnitt aus, deren Fallmuster mit einem Übereinstimmungsausdruck übereinstimmt und dessen Case Guard( falls vorhanden) ausgewertet wird true. Eine switch Anweisung wertet Groß-/Kleinschreibungsmuster 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 Großbuchstabe behandelt wird oder dessen Muster nicht übereinstimmen kann.

Hinweis

Der default Fall kann an einer beliebigen Stelle in einer switch Anweisung angezeigt werden. Unabhängig von ihrer Position wird der default Fall nur ausgewertet, wenn alle anderen Fallmuster nicht ü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 das folgende Beispiel zeigt:

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 wechseln. Wie die Beispiele in diesem Abschnitt zeigen, verwenden Sie in der Regel die break Anweisung am Ende jedes Switch-Abschnitts, um die Kontrolle über eine switch Anweisung zu übergeben. Sie können auch die Rückgabe - und Throw-Anweisungen verwenden, um die Kontrolle über eine switch Anweisung zu übergeben. Um das Fall-Through-Verhalten nachzuahmen und das Steuerelement an einen anderen Switch-Abschnitt zu übergeben, können Sie die goto Anweisung verwenden.

Von Bedeutung

Jeder Schalterabschnitt muss mit einem break, goto oder return. Wenn Sie von einem Switchabschnitt zum nächsten wechseln, wird ein Compilerfehler generiert. Es können jedoch mehrere Schalterbeschriftungen auf denselben Schalterabschnitt angewendet werden, wie z case < 0: . B. oben. Diese bewusste Designauswahl ermöglicht eine präzise Behandlung mehrerer Fälle, die dieselbe oder interdependente Logik gemeinsam nutzen.

In einem Ausdruckskontext können Sie den switch Ausdruck verwenden, um einen einzelnen Ausdruck aus einer Liste der Kandidatenausdrücke basierend auf einer Mustervergleich mit einem Ausdruck auszuwerten.

Von Bedeutung

Unterschiede zwischen Switchausdruck und Switch-Anweisung:

  • switch-Anweisung wird verwendet, um den Ausführungsfluss innerhalb eines Codeblocks zu steuern.
  • switch expression is typically used in contexts of value return and value assignment, often as a expression-bodied members.
  • Ein Switch expression case section cannot be empty, a switch statement can.

Case Guards

Ein Fallmuster ist möglicherweise nicht ausdrucksstark genug, um die Bedingung für die Ausführung des Schalterabschnitts anzugeben. In einem solchen Fall können Sie einen Fallschutz verwenden. Dies ist 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 Schlüsselwort an, das when einem Muster folgt, wie das folgende Beispiel zeigt:

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.

Siehe auch