Instrukcje wyboru — if, if-elsei switch

if-else Instrukcje ifi switch wybierają instrukcje do wykonania z wielu możliwych ścieżek na podstawie wartości wyrażenia. Instrukcja if wykonuje instrukcję tylko wtedy, gdy podane wyrażenie logiczne zwróci wartość true. Instrukcja if-else umożliwia wybranie dwóch ścieżek kodu do naśladowania na podstawie wyrażenia logicznego. Instrukcja switch wybiera listę instrukcji do wykonania na podstawie dopasowania wzorca z wyrażeniem.

Instrukcja if

Instrukcja if może być dowolną z następujących dwóch form:

  • Instrukcja if ze else częścią wybiera jedną z dwóch instrukcji do wykonania na podstawie wartości wyrażenia logicznego, jak pokazano w poniższym przykładzie:

    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!");
        }
    }
    
  • Instrukcja if bez else części wykonuje treść tylko wtedy, gdy wyrażenie logiczne daje wartość true, jak pokazano w poniższym przykładzie:

    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}");
    }
    

Instrukcje można zagnieżdżać if , aby sprawdzić wiele warunków, jak pokazano w poniższym przykładzie:

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}");
    }
}

W kontekście wyrażenia można użyć operatora ?: warunkowego, aby ocenić jedno z dwóch wyrażeń na podstawie wartości wyrażenia logicznego.

Instrukcja switch

Instrukcja switch wybiera listę instrukcji do wykonania na podstawie dopasowania wzorca z wyrażeniem dopasowania, jak pokazano w poniższym przykładzie:

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;
    }
}

W poprzednim przykładzie instrukcja switch używa następujących wzorców:

  • Wzorzec relacyjny: aby porównać wynik wyrażenia z stałą.
  • Wzorzec stałej: przetestuj, czy wynik wyrażenia jest równy stałej.

Ważne

Aby uzyskać informacje o wzorcach obsługiwanych przez instrukcję switch , zobacz Patterns (Wzorce).

W poprzednim przykładzie pokazano również przypadek default . Przypadek default określa instrukcje do wykonania, gdy wyrażenie dopasowania nie pasuje do żadnego innego wzorca wielkości liter. Jeśli wyrażenie dopasowania nie pasuje do żadnego wzorca przypadku i nie default ma wielkości liter, kontrolka przechodzi przez instrukcję switch .

Instrukcja switch wykonuje listę instrukcji w pierwszej sekcji przełącznika, której wzorzec wielkości liter pasuje do truewyrażenia dopasowania i którego funkcja case guard, jeśli jest obecna, daje wartość . Instrukcja switch ocenia wzorce wielkości liter w kolejności tekstowej od góry do dołu. Kompilator generuje błąd, gdy switch instrukcja zawiera niemożliwy do osiągnięcia przypadek. Jest to przypadek, który jest już obsługiwany przez wielkie litery lub którego wzorzec jest niemożliwy do dopasowania.

Uwaga

Przypadek default może pojawić się w dowolnym miejscu w instrukcji switch . Niezależnie od jego położenia wielkość liter jest oceniana tylko wtedy, default gdy wszystkie inne wzorce wielkości liter nie są dopasowane lub goto default; instrukcja jest wykonywana w jednej z sekcji przełącznika.

Można określić wiele wzorców wielkości liter dla jednej sekcji instrukcji switch , jak pokazano w poniższym przykładzie:

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;
    }
}

W ramach switch instrukcji kontrolka nie może przechodzić z jednej sekcji przełącznika do następnej. Jak pokazano w przykładach w tej sekcji, zazwyczaj używasz break instrukcji na końcu każdej sekcji przełącznika, aby przekazać kontrolę z instrukcji switch . Możesz również użyć instrukcji return i throw , aby przekazać kontrolę z instrukcji switch . Aby naśladować zachowanie fall-through i przekazać kontrolkę do innej sekcji przełącznika, można użyć instrukcji goto.

W kontekście wyrażenia można użyć switch wyrażenia do obliczenia pojedynczego wyrażenia z listy wyrażeń kandydatów na podstawie dopasowania wzorca z wyrażeniem.

Osłony wielkości liter

Wzorzec przypadku może nie być wystarczająco wyraźny, aby określić warunek wykonania sekcji przełącznika. W takim przypadku można użyć ochrony wielkości liter. Jest to dodatkowy warunek, który musi być spełniony wraz z dopasowanym wzorcem. Ochrona wielkości liter musi być wyrażeniem logicznym. Należy określić ochronę wielkości liter po słowie when kluczowym, które jest zgodne ze wzorcem, jak pokazano w poniższym przykładzie:

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;
    }
}

W poprzednim przykładzie użyto wzorców pozycyjnych z zagnieżdżonym wzorcem relacyjnymi.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:

Aby uzyskać więcej informacji na temat wzorców, zobacz sekcję Wzorce i dopasowywanie wzorców specyfikacji języka C#.

Zobacz też