Share via


switch (Referência de C#)

A declaração de switch é uma declaração de controle que seleciona uma seção de opção para executar a partir de uma lista de candidatos.

Uma instrução de switch inclui uma ou mais seções de opção. Cada seção de troca contém um ou mais rótulos de caso seguidos por uma ou mais instruções. O exemplo a seguir mostra uma instrução switch simples que tem três seções de alternância. Cada seção de troca tem um rótulo de caso, como case 1, e duas instruções.

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

Comentários

Cada rótulo de caso especifica um valor constante. A expressão de opção transfere o controle para a seção de opção cujo rótulo de caso corresponde ao valor da expressão de opção (caseSwitch no exemplo). Se nenhum rótulo de caso contiver um valor correspondente, o controle será transferido para a seção default, se houver. Se não houver nenhuma seção default, nenhuma ação será tomada e o controle será transferido para fora da instrução switch. No exemplo anterior, as instruções na primeira seção de opção são executadas porque case 1 corresponde ao valor de caseSwitch.

Uma instrução de switch pode incluir qualquer número de seções de opção, e cada seção pode ter um ou mais rótulos de caso (conforme mostrado no exemplo de rótulos de caso de cadeia de caracteres abaixo). No entanto, nenhum rótulo de dois casos pode conter o mesmo valor constante.

A execução da lista de instrução na seção de opção selecionada começa com a primeira instrução e continua pela lista de instrução, normalmente até que uma instrução ignorar seja alcançada, como break, goto case, return ou throw. Nesse ponto, o controle é transferido fora da declaração de switch ou a outro rótulo de caso.

Ao contrário do C++, C# não permite que a execução continue de uma seção de opção para a próxima. O código a seguir causa um erro.

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# requer o fim das seções de opção, incluindo a final, para ser inacessível. Isto é, diferentemente de alguns outros idiomas, seu código por não cair completamente na próxima seção de troca. Embora esse requisito seja atendido geralmente usando uma instrução break, o seguinte caso também é válido, porque o fim da lista de instrução não pode ser alcançado.

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

Exemplo

O exemplo a seguir ilustra os requisitos e recursos de uma instrução 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;
        }
    }
}

No exemplo final, a variável de cadeia de caracteres, str, e os rótulos dos casos de cadeia de caracteres controlam o fluxo de execução.

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 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 (str)
        {
            case "1":
            case "small":
                cost += 25;
                break;
            case "2":
            case "medium":
                cost += 25;
                goto case "1";
            case "3":
            case "large":
                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.
*/

Especificação da Linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Palavras-chave C#

Instrução switch (C++)

if-else (Referência de C#)

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#