1. if / else — sem surpresas
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
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.
string ClassificarNota(int nota)
{
switch (nota)
{
case 10:
case 9:
return "Excelente";
case 8:
case 7:
return "Bom";
default:
return "Precisa melhorar";
}
}
string ClassificarNota(int nota) => nota switch
{
10 or 9 => "Excelente",
8 or 7 => "Bom",
>= 5 => "Regular",
_ => "Precisa melhorar"
};
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
// 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-while | Idênticos em sintaxe e comportamento |
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
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).
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.