Udostępnij przez


Instrukcje wyboru — if, if-elsei switch

Instrukcje if, if-elsei 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.

Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację funkcji w publicznej wersji zapoznawczej nadchodzącej wersji językowej.

Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.

Wskazówka

Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.

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 użyj operatora ?:warunkowego, aby ocenić jedno z dwóch wyrażeń na podstawie wartości wyrażenia logicznego.

Instrukcja switch

Instrukcja switch wybiera serię 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:

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 wyrażenia dopasowania i którego true, 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. Ten błąd występuje, gdy wielkie litery już obsługują przypadek lub gdy wzorzec jest niemożliwy do dopasowania.

Uwaga / Notatka

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ć instrukcjigoto .

Ważne

Każda sekcja przełącznika musi kończyć się elementem break, gotolub return. Przejście z jednej sekcji przełącznika do następnej powoduje wygenerowanie błędu kompilatora. Można jednak zastosować wiele etykiet przełączników do tej samej sekcji przełącznika, jak case < 0: w poprzednim przykładzie. Ten celowy wybór projektu umożliwia zwięzłe obsługę wielu przypadków, które współdzielą tę samą lub współzależną logikę.

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.

Ważne

Różnice między wyrażeniem przełącznika i instrukcją switch:

  • instrukcja switch służy do kontrolowania przepływu wykonywania w bloku kodu.
  • wyrażenie przełącznika jest zwykle używane w kontekstach zwracanej wartości i przypisania wartości, często jako składowych z wyrażeniem.
  • Sekcja przypadku wyrażenia przełącznika nie może być pusta, ale sekcja przypadku instrukcji switch może.

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 należy użyć ochrony wielkości liter. Warunek musi być spełniony wraz z dopasowanym wzorcem. Ochrona wielkości liter musi być wyrażeniem logicznym. Określ ochronę wielkości liter po słowie when kluczowym, który jest zgodny 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ówspecyfikacji języka C#.

Zobacz także