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


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;

        // Notice the goto statements in cases 2 and 3. The base cost of 25
        // cents is added to the additional cost for the medium and large sizes.
        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 (C++)

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

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

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

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

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