Instruções de seleção

Tip

Este artigo faz parte da seção Conceitos Básicos para desenvolvedores que já conhecem pelo menos uma linguagem de programação e estão aprendendo C#. Se você é novo em programação, comece com os tutoriais Comece agora. Para obter a sintaxe completa, consulte as instruções de seleção na referência de idioma.

Vindo de outro idioma? C++, Java e JavaScript compartilham a herança de C, portantoif, elsee switch leem o mesmo em C#. A única diferença que vale a pena observar: o C# proíbe a passagem entre casos switch não vazios, e cada rótulo case pode testar um padrão em vez de apenas uma constante. Se você vem do Python, 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 do Python.

As instruções de seleção escolhem qual bloco de código é executado com base em uma condição. O C# oferece duas construções: if (com um else opcional) para ramificação com base em um valor booleano e switch para comparar um valor com vários casos possíveis. Uma expressão booleana é qualquer expressão que resulta em true ou false, como a comparação temperature >= 25.

Criar ramificação com if e else

Uma if instrução executa seu bloco somente quando sua expressão booliana é true. Adicione um else bloco para fornecer o código que é executado 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 uma if ou else é uma única instrução, como uma atribuição ou uma chamada de método. Uma instrução de bloco é, por si só, uma única instrução que delimita zero ou mais instruções entre chaves ({ }).

Muitos padrões de codificação recomendam que você delimite os blocos dos ramos com chaves, mesmo quando houver apenas uma única instrução. As chaves tornam o escopo explícito. Ele evita um erro comum: adicionar depois uma segunda linha que você espera que seja executada condicionalmente, mas que acaba sendo executada incondicionalmente. Somente as chaves decidem quais instruções pertencem ao branch. C# não trata os espaços em branco como relevantes, portanto a indentação, por si só, nunca é suficiente. Chaves são legais mesmo em torno de uma linha: o bloco é a única instrução que o branch executa. Indente seu código para melhorar a legibilidade, mas use as chaves para definir o bloco.

Testar várias condições com else if

Para escolher entre mais de dois caminhos, encadeie condições com else if. O C# avalia cada condição em ordem e executa o primeiro bloco cuja condição é true, em seguida, ignora o restante. Um último else trata 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 em uma cadeia. Como a primeira condição correspondente vence, coloque 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 seja mapeada para "B", em vez de "C".

Associar um valor a uma instrução switch

Quando você compara um único valor com muitos casos discretos, uma instrução switch fica mais clara do que uma longa cadeia de else if. Como if, a instrução switch é uma instrução de ramificação: ela escolhe qual código executar. Cada case rótulo lista um valor para correspondência, e cada case seção termina com uma break instrução. Agrupe rótulos para compartilhar um corpo e use a seção default para valores aos quais nenhum caso corresponde:

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 de C e Java, o C# não permite que a execução passe de uma seção não úmida case para a próxima. Cada seção que contém código deve terminar com uma break (ou outra instrução jump, como return ou goto). Essa regra impede que os bugs de fall-through acidentais sejam comuns nesses idiomas.

Padrões de teste com case e when

Um case rótulo não se limita a valores constantes. Ele pode testar um padrão, que é uma regra que descreve a forma ou o valor dos dados. Um padrão relacional, como, por < 0 exemplo, corresponde a qualquer valor menor que zero. Adicione uma when cláusula para anexar uma condição extra que também deve ser true para que o caso corresponda:

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;
}

Os casos baseados em padrão são avaliados de cima para baixo, portanto, padrões mais específicos pertencem antes dos mais gerais. Para o catálogo completo de padrões, consulte a correspondência de padrões.

Selecionar um valor com uma expressão

As if instruções e as switch instruções decidem qual código é executado. Quando, em vez disso, você precisar escolher um valor, use uma expressão. Uma expressão resulta em um valor, portanto, você pode usá-la em qualquer lugar em que se espere um valor, como o lado direito de uma atribuição ou um argumento de método. O C# oferece formulários de expressão que selecionam um valor de alternativas como o operador condicional e a switch expressão.

Operador condicional ?:

O operador ?: condicional escolhe um dos dois valores com base em uma condição booliana.

Para sua sintaxe, comportamento de curto-circuito e orientação sobre como escolhê-la em vez deif/else, consulte o operador ?:condicional.

expressãoswitch

Uma expressão switch é o equivalente em forma de expressão à instrução switch. Em vez de executar o código do caso correspondente, resulta em 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 de entrada possíveis. A switch expressão é uma parte central da correspondência de padrões. Para saber quando e como usá-lo, consulte correspondência de padrões e a referência da expressão switch.

Consulte também