C#: Condicionais
1. A instrução if
A instrução if executa um bloco de código com base no resultado de uma expressão booleana. Quando a condição é verdadeira, o bloco é executado; quando é falsa, ele é ignorado.
int score = 85;
if (score >= 60)
{
Console.WriteLine("Passed");
}
Passed
2. A instrução if...else
Use a estrutura if...else para executar um ramo quando a condição for verdadeira e outro quando for falsa.
int age = 16;
if (age >= 18)
{
Console.WriteLine("Adult");
}
else
{
Console.WriteLine("Minor");
}
Minor
3. if...else if: ramificações múltiplas
Quando for necessário verificar várias condições mutuamente exclusivas, use else if para testá-las em ordem. Apenas o primeiro ramo correspondente será executado.
int score = 78;
if (score >= 90)
{
Console.WriteLine("Excellent");
}
else if (score >= 80)
{
Console.WriteLine("Good");
}
else if (score >= 60)
{
Console.WriteLine("Pass");
}
else
{
Console.WriteLine("Fail");
}
Pass
4. if aninhado
As instruções if podem ser aninhadas, mas procure limitar o aninhamento a, no máximo, dois níveis. O aninhamento excessivo prejudica a legibilidade — considere extrair um método ou usar else if em vez disso.
▶ Exemplo
int age = 25;
bool hasTicket = true;
if (age >= 18)
{
if (hasTicket)
{
Console.WriteLine("Admitted");
}
else
{
Console.WriteLine("Ticket required");
}
}
else
{
Console.WriteLine("Too young");
}
Admitted
5. A instrução switch
Uma instrução switch compara uma expressão com vários valores constantes e executa o ramo case correspondente. Ao contrário do C/C++, o C# não permite o fall-through; cada caso deve terminar com break, return ou throw, caso contrário, ocorrerá um erro de compilação.
▶ Exemplo
int day = 3;
switch (day)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
case 4:
Console.WriteLine("Thursday");
break;
case 5:
Console.WriteLine("Friday");
break;
default:
Console.WriteLine("Weekend");
break;
}
Wednesday
Vários casos podem compartilhar a mesma lógica ao listar seus rótulos consecutivamente:
int month = 2;
switch (month)
{
case 12:
case 1:
case 2:
Console.WriteLine("Winter");
break;
case 3:
case 4:
case 5:
Console.WriteLine("Spring");
break;
default:
Console.WriteLine("Other season");
break;
}
Winter
Dica: Em C#, se você realmente precisar pular de um caso para outro, deve usar
goto case x; não é permitido omitir obreakpara permitir a passagem direta.
6. Expressões switch (C# 8+)
O C# 8 introduziu as expressões switch, que são expressões e não instruções. Elas retornam o resultado correspondente com uma sintaxe mais concisa. Use _ para o ramo padrão.
▶ Exemplo
int code = 404;
string message = code switch
{
200 => "OK",
301 => "Moved",
404 => "Not Found",
500 => "Server Error",
_ => "Unknown"
};
Console.WriteLine(message);
Not Found
7. Noções básicas sobre correspondência de padrões
A partir do C# 7, é possível usar a correspondência de padrões na lógica condicional. As formas mais comuns incluem padrões de tipo (is Type variable) e condições “when”.
▶ Exemplo
object obj = "Hello C#";
if (obj is string s)
{
Console.WriteLine($"String length: {s.Length}");
}
else
{
Console.WriteLine("Not a string");
}
String length: 8
Use uma condição when em um switch para adicionar condições adicionais:
int value = 15;
string category = value switch
{
int i when i > 100 => "Extra large",
int i when i > 10 => "Medium",
int i when i > 0 => "Small",
_ => "Invalid"
};
Console.WriteLine(category);
Medium
8. O operador condicional ?:
O operador condicional ?:, também conhecido como operador ternário, é uma forma abreviada de if...else. A sintaxe é condition ? valueIfTrue : valueIfFalse, e a expressão completa resulta no valor correspondente.
▶ Exemplo
int age = 20;
string status = age >= 18 ? "Adult" : "Minor";
Console.WriteLine(status);
Adult
Uso aninhado (evite aninhamento excessivo):
int score = 75;
string result = score >= 90 ? "A" : score >= 60 ? "B" : "C";
Console.WriteLine(result);
B
Aviso: a legibilidade diminui drasticamente quando o operador condicional é aninhado em mais de dois níveis. Use instruções if...else if em vez disso.
❓ Perguntas Frequentes
P: As instruções
switchem C# podem omitir obreakpara permitir o avanço automático (fall-through), como em C? R: Não. O C# proíbe o avanço automático emswitch. Cadacasedeve terminar combreak,returnouthrow; caso contrário, ocorrerá um erro de compilação. Para compartilhar a lógica, liste vários rótulos decaseconsecutivamente.
P: Qual é a diferença entre uma expressão switch e uma instrução switch? R: Uma expressão switch é uma expressão que deve retornar um valor, utilizando
=>e ramos separados por vírgulas. Uma instrução switch é uma instrução que não requer um valor de retorno, utilizando blocos case/break.
P: Qual é a diferença entre
ise==? R:==compara valores para verificar se são iguais, enquantoisé usado para correspondência de padrões e pode verificar o tipo ao declarar uma variável, comoobj is string s.
P: O operador condicional pode substituir todas as instruções if...else? R: Não. O operador condicional só funciona em cenários que retornam um valor e não pode conter várias instruções. Use if...else para lógicas complexas.
📖 Resumo
- A instrução
ifexecuta um bloco de código com base em uma condição booleana - if...else permite ramificações em duas direções; else if lida com várias condições mutuamente exclusivas
- Limite as instruções
ifaninhadas a dois níveis ou menos para facilitar a leitura - O switch compara valores constantes; o C# proíbe a execução automática (fall-through) e exige o uso de break, return ou throw
- As expressões switch (C# 8+) são uma alternativa concisa que retorna um valor, utilizando
_como valor padrão - A correspondência de padrões utiliza
is Type varpara verificar tipos e extrair valores; quando as condições de verificação acrescentam condições adicionais - O operador condicional
?:simplifica as atribuições simples de duas vias
📝 Exercícios
- Escreva um programa que leia um número inteiro e determine se ele é positivo, negativo ou zero; em seguida, exiba o resultado
- Use uma expressão
switchpara associar um mês (1 a 12) ao nome da estação correspondente - Escreva um programa que receba uma variável de objeto, utilize a correspondência de padrões
ispara determinar seu tipo (int, string ou outro) e exiba o tipo e o valor - Use o operador condicional para converter uma nota numérica em uma nota alfabética (90 ou mais é A, 80 ou mais é B, 60 ou mais é C; caso contrário, D) e, em seguida, compare a legibilidade com uma versão usando if...else if