Поделиться через


switch (Справочник по C#)

Выражение switch — это оператор управления, выбирающий раздел переключения для выполнения из списка кандидатов.

Каждый раздел switch содержит одну или несколько меток case и список из одного или нескольких операторов. В следующем примере показан простой оператор switch с тремя разделами параметров. Каждый раздел switch содержит одну метку case, такую как case 1, и список из двух операторов.

Пример

int caseSwitch = 1;
switch (caseSwitch)
{
    case 1:
        Console.WriteLine("Case 1");
        break;
    case 2:
        Console.WriteLine("Case 2");
        break;
    default:
        Console.WriteLine("Default case");
        break;
}

В каждой метке case указывается постоянное значение. Управление передается разделу оператора switch, метка case которого содержит постоянное значение, соответствующее значению выражения switch, caseSwitch. Если метка case не содержит соответствующего значения, элемент управления передается в раздел default, если таковой имеется. Если раздела default нет, действия не предпринимаются и элемент управления передается за пределы оператора switch. В предыдущем примере выполняются инструкции первого раздела switch, потому что метка case case 1 определяет значение 1 и значение caseSwitch — также 1.

Оператор switch может включать любое количество разделов switch, причем каждый раздел может содержать одну или несколько меток case. Однако две метки case не могут содержать одно и то же постоянное значение.

Выполнение списка операторов в выбранном разделе начинается с первого оператора и продолжается по списку, обычно до достижения оператора перехода, такого как break, goto case, return или throw. В этой точке управление передается за пределы оператора switch или к другой метке case.

В отличие от C++ C# не позволяет продолжить выполнение с одной секции переключения на другую. Приведенный ниже код вызывает ошибку.

switch (caseSwitch)
{
    // The following switch section causes an error.
    case 1:
        Console.WriteLine("Case 1...");
        // Add a break or other jump statement here.
    case 2:
        Console.WriteLine("... and/or Case 2");
        break;
}

В C# существует требование: конец каждого раздела switch, включая заключительный, должен быть недостижимым. Хотя это требование обычно выполняется с помощью оператора перехода, допустим также следующий случай, потому что достигнуть конца списка операторов невозможно.

case 4:
    while (true)
        Console.WriteLine("Endless looping. . . .");

В следующем примере показано требования и возможности оператора switch.

class Program
{
    static void Main(string[] args)
    {
        int switchExpression = 3;
        switch (switchExpression)
        {
            // A switch section can have more than one case label.
            case 0:
            case 1:
                Console.WriteLine("Case 0 or 1");
                // Most switch sections contain a jump statement, such as
                // a break, goto, or return. The end of the statement list
                // must be unreachable.
                break;
            case 2:
                Console.WriteLine("Case 2");
                break;
                // The following line causes a warning.
                Console.WriteLine("Unreachable code");
            // 7 - 4 in the following line evaluates to 3.
            case 7 - 4:
                Console.WriteLine("Case 3");
                break;
            // If the value of switchExpression is not 0, 1, 2, or 3, the
            // default case is executed.
            default:
                Console.WriteLine("Default case (optional)");
                // You cannot "fall through" any switch section, including
                // the last one.
                break;
        }
    }
}

В последнем примере строковые входные данные преобразуется в целочисленную переменную switchExp, которая используется для оператора switch. Можно также использовать непосредственно строковую переменную str. Для этого необходимо изменить метки case, чтобы задать строковые значения, как показано в следующем примере кода.

switch(str)
{
    case "1":
        // ...
    case "2":
        // ...
}
class SwitchTest
{
    static void Main()
    {
        Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large");
        Console.Write("Please enter your selection: ");
        string str = Console.ReadLine();
        int switchExp = int.Parse(str);
        int cost = 0;
        switch (switchExp)
        {
            case 1:
                cost += 25;
                break;
            case 2:
                cost += 25;
                goto case 1;
            case 3:
                cost += 50;
                goto case 1;
            default:
                Console.WriteLine("Invalid selection. Please select 1, 2, or 3.");
                break;
        }
        if (cost != 0)
        {
            Console.WriteLine("Please insert {0} cents.", cost);
        }
        Console.WriteLine("Thank you for your business.");
    }
}
/*
    Sample Input: 2

    Sample Output:
    Coffee sizes: 1=Small 2=Medium 3=Large
    Please enter your selection: 2
    Please insert 50 cents.
    Thank you for your business.
*/

Спецификация языка C#

Дополнительные сведения см в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Ключевые слова C#

switch Statement (C++)

if-else (Справочник по C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#

Журнал изменений

Дата

Журнал

Причина

Сентябрь 2010

В список операторов перехода, которые могут завершать раздел switch, добавлен оператор "throw".

Обратная связь от клиента.