A Instrução switch: Escolhendo Entre Muitas Opções

A Instrução switch: Escolhendo Entre Muitas Opções

Quando comparar um mesmo valor contra muitas opções, encadear condições fica verboso. O switch resolve isso, e sua forma moderna de expressão devolve um valor diretamente. A aula mostra a sintaxe, um menu de opções como exemplo prático, e quando preferir o switch ou o if.
Linguagem C#

• • 10 min de leitura

Na aula anterior, aprendemos a tomar decisões com if/else if/else. Essa estrutura é poderosa e suficiente para qualquer decisão — mas há um padrão específico em que ela fica repetitiva e um tanto pesada: quando comparamos um mesmo valor contra muitas possibilidades distintas. Classificar um dia da semana, reagir a uma opção de menu, traduzir um código — todos seguem a forma "se o valor for isto, faça aquilo; se for aquilo outro, faça outra coisa...". Para esse padrão, o C# oferece uma estrutura especializada e mais elegante: o switch. Ele não substitui o if — decisões com faixas ou condições complexas continuam sendo território do if —, mas para o caso de "um valor, muitas opções fixas", o switch produz um código mais limpo e legível. Esta aula o apresenta.

O problema que o switch resolve

Imagine que você queira, a partir de um número de 1 a 7, exibir o nome do dia da semana. Com if/else if, ficaria assim:

int dia = 3;

if (dia == 1) Console.WriteLine("Domingo");
else if (dia == 2) Console.WriteLine("Segunda");
else if (dia == 3) Console.WriteLine("Terça");
else if (dia == 4) Console.WriteLine("Quarta");
else if (dia == 5) Console.WriteLine("Quinta");
else if (dia == 6) Console.WriteLine("Sexta");
else if (dia == 7) Console.WriteLine("Sábado");
else Console.WriteLine("Dia inválido");

Funciona perfeitamente, mas repare no padrão cansativo: a mesma variável dia é comparada, com ==, contra um valor após o outro, linha após linha. Essa repetição de "dia ==" é justamente o que o switch elimina, expressando a mesma decisão de forma mais concisa e organizada.

A forma moderna: a expressão switch

O C# moderno oferece uma forma especialmente limpa de switch, chamada expressão switch, que combina perfeitamente com o que já sabemos. Ela pega um valor e o mapeia diretamente para um resultado. Reescrevendo o exemplo dos dias:

int dia = 3;

string nomeDia = dia switch
{
    1 => "Domingo",
    2 => "Segunda",
    3 => "Terça",
    4 => "Quarta",
    5 => "Quinta",
    6 => "Sexta",
    7 => "Sábado",
    _ => "Dia inválido"
};

Console.WriteLine(nomeDia);   // exibe: Terça

Vamos entender essa estrutura, que traz elementos novos. Escrevemos o valor a ser examinado (dia), seguido da palavra switch, e então, entre chaves, uma lista de casos. Cada caso tem a forma valor => resultado: à esquerda da seta =>, um valor possível; à direita, o resultado que aquele valor produz. O programa procura o caso cujo valor à esquerda coincide com dia (aqui, o 3), e o resultado correspondente ("Terça") é o valor da expressão inteira, que guardamos em nomeDia. É como uma tabela de correspondências: "se for 3, o resultado é Terça".

O caso especial _ (o sublinhado sozinho) é o caso padrão: ele casa com "qualquer outro valor" que não tenha correspondido a nenhum caso anterior. No exemplo, se dia fosse 9 ou -1, nenhum dos casos de 1 a 7 corresponderia, e o _ garantiria o resultado "Dia inválido". Ter um caso padrão é uma boa prática, pois assegura que a expressão sempre produza um resultado, mesmo diante de valores inesperados. A seta =>, que aqui separa cada caso do seu resultado, é um símbolo que você reencontrará em outros contextos do C#; por ora, leia-a como "resulta em" ou "leva a".

Comparando com o if: quando usar cada um

Contraste as duas versões do exemplo dos dias. A expressão switch é visivelmente mais enxuta: cada caso ocupa uma linha curta e legível, sem repetir "dia ==" continuamente, e o resultado é atribuído de forma direta a nomeDia. Para o padrão "um valor, muitas opções fixas", o switch é claramente superior em clareza.

Mas — e isto é importante — o switch tem seu domínio de aplicação. Ele brilha quando você compara um único valor contra valores fixos e específicos (1, 2, 3; "sim", "não"; opções de um menu). Ele não é a ferramenta certa quando a decisão envolve faixas ou condições complexas — por exemplo, "se a nota for maior ou igual a 90", "se o saldo for negativo e o cliente for novo". Essas decisões, com comparações de maior/menor ou combinações lógicas, continuam sendo território natural do if/else if. A regra prática: use switch para "este valor é igual a qual destas opções?"; use if para perguntas com faixas, intervalos ou combinações. (Vale mencionar que versões mais avançadas do switch conseguem lidar com faixas também, através de um recurso chamado padrões, que você encontrará mais adiante no curso; por ora, mantenha a distinção simples entre "valores exatos" e "faixas".)

Um exemplo prático: um menu de opções

O switch é ideal para reagir a escolhas do usuário, como num menu. Veja um esboço:

Console.WriteLine("Escolha uma opção:");
Console.WriteLine("1 - Ver saldo");
Console.WriteLine("2 - Depositar");
Console.WriteLine("3 - Sacar");
Console.Write("Opção: ");
string escolha = Console.ReadLine();

string acao = escolha switch
{
    "1" => "Exibindo o saldo...",
    "2" => "Iniciando depósito...",
    "3" => "Iniciando saque...",
    _   => "Opção inválida."
};

Console.WriteLine(acao);

Note dois pontos. Primeiro, o switch funciona com texto (string), não só com números — aqui comparamos a escolha contra "1", "2", "3". Como Console.ReadLine devolve texto, comparamos com os textos das opções, o que dispensa até a conversão para número neste caso. Segundo, o caso padrão _ trata graciosamente qualquer entrada que não seja uma opção válida, exibindo "Opção inválida." em vez de deixar o programa sem reação. Esse padrão de menu — exibir opções, ler a escolha, reagir com um switch — é extremamente comum, e você o reutilizará muitas vezes.

Fechando a fase das decisões, quase

Com o if e o switch, você domina agora as duas estruturas de decisão do C#, e é capaz de fazer seu programa escolher entre quantos caminhos precisar, seja por condições de faixa (if), seja por valores exatos (switch). Seus programas já raciocinam: examinam seus dados e agem de formas diferentes conforme o que encontram. Falta ainda uma capacidade fundamental para que eles sejam realmente poderosos — a de repetir ações — e é para ela que caminhamos a seguir.

Para o caso particular de comparar um mesmo valor contra muitas opções, existe uma forma mais limpa do que encadear condições. O switch expressa essa intenção diretamente, e em sua forma moderna de expressão ele devolve um valor, o que costuma eliminar variáveis intermediárias e deixar o código mais curto e mais legível.

A orientação prática é simples: quando a decisão compara uma única variável contra valores fixos, o switch comunica melhor; quando envolve faixas, combinações lógicas ou condições heterogêneas, o if encadeado continua sendo a ferramenta certa. Escolher entre os dois é uma questão de expressar com clareza o que se está decidindo.

Fontes e leituras recomendadas

Exercícios

Exercício 1

Escreva uma expressão switch que receba um número de 1 a 12 e produza o nome do mês correspondente. Inclua um caso padrão (_) para números inválidos. Teste com alguns valores, incluindo um fora da faixa.

Ver resposta

✓ Resposta: Exemplo:

int mes = 4;
string nomeMes = mes switch
{
    1 => "Janeiro", 2 => "Fevereiro", 3 => "Março", 4 => "Abril",
    5 => "Maio", 6 => "Junho", 7 => "Julho", 8 => "Agosto",
    9 => "Setembro", 10 => "Outubro", 11 => "Novembro", 12 => "Dezembro",
    _ => "Mês inválido"
};
Console.WriteLine(nomeMes);   // Abril

Um valor fora da faixa (como 0 ou 13) cai no caso _, produzindo "Mês inválido".

Exercício 2

Reescreva, usando uma expressão switch, a seguinte cadeia de if: se cor for "vermelho", resultado "pare"; se "amarelo", "atenção"; se "verde", "siga"; qualquer outra coisa, "cor desconhecida". Compare a legibilidade com a versão if.

Ver resposta

✓ Resposta: Exemplo:

string resultado = cor switch
{
    "vermelho" => "pare",
    "amarelo" => "atenção",
    "verde" => "siga",
    _ => "cor desconhecida"
};

Comparada à versão if/else if (que repetiria "cor ==" em cada linha), a expressão switch é mais legível: cada caso é uma linha curta e direta mapeando a cor ao resultado, sem a repetição da variável e do operador de comparação.

Exercício 3

Escreva um pequeno programa de menu que exiba três opções ao usuário, leia a escolha, e use uma expressão switch para exibir uma mensagem diferente para cada opção, além de uma mensagem para opção inválida. Note que você pode comparar diretamente o texto lido, sem convertê-lo.

Ver resposta

✓ Resposta: Exemplo:

Console.WriteLine("1 - Iniciar\n2 - Configurações\n3 - Sair");
Console.Write("Escolha: ");
string escolha = Console.ReadLine();
string msg = escolha switch
{
    "1" => "Iniciando o programa...",
    "2" => "Abrindo configurações...",
    "3" => "Encerrando...",
    _   => "Opção inválida."
};
Console.WriteLine(msg);

Como ReadLine devolve texto e comparamos contra os textos "1", "2", "3", não é preciso converter a escolha para número.

Exercício 4

Explique, com suas palavras, para que serve o caso _ numa expressão switch. O que aconteceria, conceitualmente, com um valor que não corresponde a nenhum caso, se não houvesse o _?

Ver resposta

✓ Resposta: O caso _ é o caso padrão de uma expressão switch: ele corresponde a qualquer valor que não tenha coincidido com nenhum dos casos anteriores, garantindo que a expressão sempre produza um resultado. Sem o _, um valor que não correspondesse a nenhum caso não teria resultado definido, e a expressão switch — que precisa produzir um valor — geraria um erro em tempo de execução ao não encontrar correspondência. O _ é a rede de segurança que cobre todos os casos não previstos explicitamente.

Exercício 5

Sem código: dê um exemplo de decisão para a qual o switch é a ferramenta apropriada, e outro para a qual o if é mais apropriado. Explique o critério que distingue os dois casos (dica: pense em "valores exatos" versus "faixas ou combinações").

Ver resposta

✓ Resposta: O switch é apropriado, por exemplo, para traduzir um código numérico de status (1, 2, 3) em uma mensagem, ou reagir a uma opção de menu — situações em que se compara um valor contra opções exatas e fixas. O if é mais apropriado, por exemplo, para classificar uma nota em faixas ("se maior ou igual a 90...") ou decidir um desconto com base em múltiplas condições combinadas — situações com faixas, intervalos ou combinações lógicas. O critério: use switch quando a pergunta é "este valor é igual a qual destas opções específicas?"; use if quando a pergunta envolve comparações de maior/menor, intervalos, ou várias condições unidas por "e"/"ou".

Comentários

Mais em Linguagem C#

Concorrência: Fazendo Várias Coisas ao Mesmo Tempo
Concorrência: Fazendo Várias Coisas ao Mesmo Tempo

Como fazer um programa não travar enquanto espera: async e await. A aula…

Sua Primeira API REST com ASP.NET Core
Sua Primeira API REST com ASP.NET Core

O primeiro serviço web em C#: uma API REST com as Minimal APIs do ASP.NET…

Retrospectiva Final: O que Você é Capaz de Construir
Retrospectiva Final: O que Você é Capaz de Construir

O encerramento do curso completo: um inventário do que passou a ser possível…