Módulo 1 · C# — Capítulo 03

Estruturas de Controle e Laços

If/else, switch e laços — familiares na superfície, com um recurso moderno (switch expressions) que não tem equivalente direto em JavaScript.

1. if / else — sem surpresas

C# if/else e o operador ternário
int idade = 20;

if (idade >= 18)
    Console.WriteLine("Maior de idade");
else if (idade >= 12)
    Console.WriteLine("Adolescente");
else
    Console.WriteLine("Criança");

string categoria = idade >= 18 ? "Adulto" : "Menor"; // ternário, igual ao JS
Nota

A única diferença estrutural relevante: a condição de um if em C# precisa ser um bool de verdade. Não existe "truthy/falsy" como em JavaScript — if (0) ou if (nome) (sendo nome uma string) simplesmente não compilam.

2. switch — statement clássico e switch expression moderna

C# tem duas formas de switch. A clássica é parecida com a de JavaScript; a moderna (C# 8+), chamada switch expression, é mais concisa e devolve um valor diretamente.

C# switch clássico
string ClassificarNota(int nota)
{
    switch (nota)
    {
        case 10:
        case 9:
            return "Excelente";
        case 8:
        case 7:
            return "Bom";
        default:
            return "Precisa melhorar";
    }
}
C# switch expression (C# 8+)
string ClassificarNota(int nota) => nota switch
{
    10 or 9  => "Excelente",
    8 or 7   => "Bom",
    >= 5     => "Regular",
    _        => "Precisa melhorar"
};
Dica

A switch expression aceita padrões, não só valores exatos: or combina múltiplos casos, >= compara faixas, e _ é o "default". Isso não existe em JavaScript (nem no switch clássico) e é frequentemente mais legível que uma cadeia de if/else if.

3. Laços: for, foreach, while, do-while

C# os quatro laços
// for — quando você precisa do índice
for (int i = 0; i < 5; i++)
    Console.WriteLine(i);

// foreach — percorrendo uma coleção (o mais comum no dia a dia)
var nomes = new List<string> { "Ana", "Bruno", "Carla" };
foreach (var nome in nomes)
    Console.WriteLine(nome);

// while — repete enquanto a condição for verdadeira
int tentativas = 0;
while (tentativas < 3)
{
    tentativas++;
}

// do-while — executa pelo menos uma vez, testa a condição depois
int numero;
do
{
    numero = LerNumeroDoUsuario();
} while (numero < 0);
C#JavaScript equivalente
for (int i = 0; i < n; i++)for (let i = 0; i < n; i++)
foreach (var x in lista)for (const x of lista)
while / do-whileIdênticos em sintaxe e comportamento
Atenção

foreach em C# não permite alterar a coleção (adicionar/remover itens) enquanto itera sobre ela — lança InvalidOperationException. Diferente do for...of do JS sobre um array mutável, que não protesta (mas também pode gerar comportamento inesperado). Se precisar remover itens durante a iteração, itere sobre uma cópia (lista.ToList()) ou use um for tradicional de trás para frente.

4. break, continue e o rótulo pouco usado

C# break e continue — iguais ao JS
foreach (var numero in Enumerable.Range(1, 10))
{
    if (numero % 2 == 0)
        continue; // pula para a próxima iteração

    if (numero > 7)
        break; // sai do laço completamente

    Console.WriteLine(numero); // imprime 1, 3, 5, 7
}

5. Pattern matching com is

Um recurso que combina bem com if: checar o tipo de um objeto e, ao mesmo tempo, extrair uma variável tipada dele — útil desde já e essencial quando você chegar em herança e polimorfismo (capítulo 6).

C# pattern matching
object valor = 42;

if (valor is int numero && numero > 0)
    Console.WriteLine($"É um inteiro positivo: {numero}");

6. Onde isso te leva

Com controle de fluxo dominado, o próximo passo é organizar esse código em blocos reutilizáveis — métodos, parâmetros e a diferença entre passar algo por valor ou por referência para dentro deles.

📌 Resumo do capítulo

  • Condições de if exigem bool de verdade — não existe truthy/falsy em C#.
  • Switch expressions (valor switch { ... }) suportam padrões (or, faixas, _) e retornam um valor diretamente.
  • foreach não permite modificar a coleção durante a iteração.
  • Pattern matching com is checa tipo e extrai variável tipada em uma única expressão.

✏️ Praticando

  1. Reescreva a função ClassificarNota do exemplo usando switch expression, adicionando uma faixa para notas entre 5 e 6 ("Regular").
  2. Escreva um laço que percorra os números de 1 a 20, pulando múltiplos de 3 (continue) e parando ao chegar em 18 (break).
  3. Escreva um método que recebe object valor e usa is para imprimir mensagens diferentes se for int, string ou nenhum dos dois.