Declarações de seleção

Sugestão

Este artigo faz parte da secção Fundamentos para programadores que já conhecem pelo menos uma linguagem de programação e estão a aprender C#. Se és novo na programação, começa primeiro pelos tutoriais para começar . Para a sintaxe completa, consulte instruções de seleção na referência da linguagem.

Vem de outra língua? C++, Java e JavaScript partilham todos a herança do C, por isso if, else, e switch leem o mesmo em C#. A única diferença digna de nota: o C# proíbe a passagem entre switch casos não vazios, e cada etiqueta case pode corresponder a um padrão, em vez de apenas a uma constante. Se vieres de Python, o if/else if/else do C# corresponde a if/elif/else, e o switch baseado em padrões do C# é o mais próximo da instrução match de Python.

As instruções de seleção escolhem qual bloco de código é executado com base numa condição. C# fornece dois: if (com uma opção else) para ramificação num valor booleano e switch para comparar um valor com vários casos. Uma expressão booleana é qualquer expressão que avalie a true ou false, como a comparação temperature >= 25.

Ramificação com if e else

Uma if instrução executa o seu bloco apenas quando a sua expressão booleana é true. Adicione um else bloco para fornecer o código que corre quando a condição é false:

int temperature = 28;

// An if statement runs its block only when the condition is true.
// The else block runs when the condition is false.
if (temperature >= 25)
{
    Console.WriteLine("Warm"); // => Warm
}
else
{
    Console.WriteLine("Cool");
}

O corpo de um if ou else é uma única afirmação, como uma atribuição ou uma chamada de método. Uma instrução de bloco é, por si só, uma única instrução que engloba zero ou mais instruções entre chavetas ({ }).

Muitos padrões de codificação recomendam que os blocos dos ramos sejam delimitados por chavetas, mesmo quando contêm apenas uma instrução. As chavetas tornam o âmbito explícito. Evita um erro comum: adicionar posteriormente uma segunda linha que espera que seja executada condicionalmente, mas que, em vez disso, é executada incondicionalmente. Só as chaves decidem quais as afirmações que pertencem ao ramo. O C# não trata o espaço em branco como algo significativo, por isso a indentação sozinha nunca o faz. Os aparelhos são legais mesmo em torno de uma linha: o bloco é a única instrução que o ramal executa. Indente o código para facilitar a leitura, mas use as chavetas para definir o bloco.

Testar várias condições com else if

Para escolher entre mais de dois caminhos, encadeie as condições com else if. C# avalia cada condição por ordem e executa o primeiro bloco cuja condição é true, depois salta o resto. Um final else trata de todos os casos restantes:

int score = 82;

// Chain conditions with else if. The first branch whose condition is
// true runs; the compiler skips the rest.
string grade;
if (score >= 90)
{
    grade = "A";
}
else if (score >= 80)
{
    grade = "B";
}
else if (score >= 70)
{
    grade = "C";
}
else
{
    grade = "F";
}

Console.WriteLine(grade); // => B

A ordem é importante numa cadeia. Como a primeira condição correspondente vence, coloca as condições mais específicas em primeiro lugar. No exemplo anterior, testar score >= 80 antes de score >= 70 garante que uma pontuação de 82 corresponde a "B" em vez de "C".

Associe um valor a uma switch instrução

Quando se compara um único valor com muitos casos discretos, uma instrução switch é mais clara do que uma longa cadeia de else if. Tal como if, a switch instrução é uma instrução ramificada: escolhe que código executar. Cada case rótulo indica um valor a corresponder, e cada case secção termina com uma break declaração. Agrupe rótulos para partilharem o mesmo corpo e use a secção default para valores que não correspondem a nenhum caso:

DayOfWeek day = DayOfWeek.Saturday;

// A switch statement compares one value against several case labels.
// Stacked labels share a body. Each section ends with break, and the
// default section runs when no case matches.
switch (day)
{
    case DayOfWeek.Saturday:
    case DayOfWeek.Sunday:
        Console.WriteLine("Weekend"); // => Weekend
        break;
    default:
        Console.WriteLine("Weekday");
        break;
}

Ao contrário do C e do Java, o C# não permite que a execução passe de uma secção não vazia case para a seguinte. Cada secção que contenha código deve terminar com uma break (ou outra instrução jump, como return ou goto). Esta regra previne os bugs acidentais de falha comum nessas línguas.

Padrões de teste com case e when

Um case rótulo não está limitado a valores constantes. Pode testar um padrão, que é uma regra que descreve a forma ou o valor dos dados. Um padrão relacional, como , < 0 corresponde a qualquer valor inferior a zero. Adicione uma when cláusula para anexar uma condição extra que também deve ser true para que o caso coincida:

int measurement = 42;

// A case label can test a pattern instead of a constant. A when clause
// adds a condition that must also be true for the case to match.
switch (measurement)
{
    case < 0:
        Console.WriteLine("Negative");
        break;
    case 0:
        Console.WriteLine("Zero");
        break;
    case > 0 when measurement % 2 == 0:
        Console.WriteLine("Positive and even"); // => Positive and even
        break;
    default:
        Console.WriteLine("Positive and odd");
        break;
}

Casos baseados em padrões são avaliados de cima a baixo, por isso padrões mais específicos pertencem antes dos mais gerais. Para o catálogo completo de padrões, veja correspondência de padrões.

Selecione um valor com uma expressão

As if instruções e switch decidem qual o código que é executado. Quando precisares de escolher um valor, usa uma expressão. Uma expressão avalia um valor, por isso pode usá-la em qualquer lugar onde se espere um valor, como no lado direito de uma tarefa ou num argumento de método. C# oferece formas de expressão que selecionam um valor entre alternativas como o operador condicional e a switch expressão.

Operador condicional ?:

O operador ?: condicional escolhe um de dois valores com base numa condição booleana.

Para obter informações sobre a sua sintaxe, o comportamento de curto-circuito e orientações sobre quando escolhê-lo em vez de if/else, consulte operador condicional ?:.

switch expressão

Uma switch expressão é o equivalente expressivo à switch afirmação. Em vez de executar código para o caso correspondente, produz um valor. É mais conciso do que atribuir um valor em cada ramo de uma instrução switch, e o compilador avisa quando os ramos não cobrem todos os valores possíveis. A switch expressão é uma parte central da correspondência de padrões. Para saber quando e como utilizá-la, consulte correspondência de padrões e a referência da expressão switch.

Ver também