Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Declarações de seleção -
As ifinstruções , if-else e switch selecionam instruções para executar a partir de muitos caminhos possíveis com base no valor de uma expressão. A if instrução executa uma instrução somente se uma expressão booleana fornecida for avaliada como true. A if-else instrução permite que você escolha qual dos dois caminhos de código seguir com base em uma expressão booleana. A switch instrução seleciona uma lista de instruções para executar com base em uma correspondência de padrão com uma expressão.
Declaração if
Uma declaração pode ter qualquer uma if das duas formas seguintes:
Uma
ifinstrução com umaelseparte seleciona uma das duas instruções a serem executadas com base no valor de uma expressão booleana, como mostra o exemplo a seguir:DisplayWeatherReport(15.0); // Output: Cold. DisplayWeatherReport(24.0); // Output: Perfect! void DisplayWeatherReport(double tempInCelsius) { if (tempInCelsius < 20.0) { Console.WriteLine("Cold."); } else { Console.WriteLine("Perfect!"); } }Uma
ifinstrução sem umaelseparte executa seu corpo somente se uma expressão booleana for avaliada comotrue, como mostra o exemplo a seguir:DisplayMeasurement(45); // Output: The measurement value is 45 DisplayMeasurement(-3); // Output: Warning: not acceptable value! The measurement value is -3 void DisplayMeasurement(double value) { if (value < 0 || value > 100) { Console.Write("Warning: not acceptable value! "); } Console.WriteLine($"The measurement value is {value}"); }
Você pode aninhar if instruções para verificar várias condições, como mostra o exemplo a seguir:
DisplayCharacter('f'); // Output: A lowercase letter: f
DisplayCharacter('R'); // Output: An uppercase letter: R
DisplayCharacter('8'); // Output: A digit: 8
DisplayCharacter(','); // Output: Not alphanumeric character: ,
void DisplayCharacter(char ch)
{
if (char.IsUpper(ch))
{
Console.WriteLine($"An uppercase letter: {ch}");
}
else if (char.IsLower(ch))
{
Console.WriteLine($"A lowercase letter: {ch}");
}
else if (char.IsDigit(ch))
{
Console.WriteLine($"A digit: {ch}");
}
else
{
Console.WriteLine($"Not alphanumeric character: {ch}");
}
}
Em um contexto de expressão, você pode usar o operador ?:condicional para avaliar uma das duas expressões com base no valor de uma expressão booleana.
Declaração switch
A switch instrução seleciona uma lista de instruções para executar com base em uma correspondência de padrão com uma expressão de correspondência, como mostra o exemplo a seguir:
DisplayMeasurement(-4); // Output: Measured value is -4; too low.
DisplayMeasurement(5); // Output: Measured value is 5.
DisplayMeasurement(30); // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN); // Output: Failed measurement.
void DisplayMeasurement(double measurement)
{
switch (measurement)
{
case < 0.0:
Console.WriteLine($"Measured value is {measurement}; too low.");
break;
case > 15.0:
Console.WriteLine($"Measured value is {measurement}; too high.");
break;
case double.NaN:
Console.WriteLine("Failed measurement.");
break;
default:
Console.WriteLine($"Measured value is {measurement}.");
break;
}
}
No exemplo anterior, a switch instrução usa os seguintes padrões:
- Um padrão relacional: para comparar um resultado de expressão com uma constante.
- Um padrão constante: teste se um resultado de expressão é igual a uma constante.
Importante
Para obter informações sobre os padrões suportados switch pela instrução, consulte Padrões.
O exemplo anterior também demonstra o default caso. O default caso especifica instruções a serem executadas quando uma expressão de correspondência não corresponde a nenhum outro padrão de ocorrência. Se uma expressão de correspondência não corresponder a nenhum padrão de maiúsculas e minúsculas e não default houver maiúsculas e minúsculas, o controle cairá por meio de uma switch instrução.
Uma switch instrução executa a lista de instruções na primeira seção de switch cujo padrão de maiúsculas e minúsculas corresponde a uma expressão de correspondência e cujo protetor de caso, se presente, é avaliado como true. Uma switch instrução avalia padrões de caso em ordem de texto de cima para baixo. O compilador gera um erro quando uma switch instrução contém um caso inacessível. Trata-se de um caso que já é tratado por uma caixa alta ou cujo padrão é impossível de igualar.
Observação
O default caso pode aparecer em qualquer lugar dentro de uma switch declaração. Independentemente de sua posição, o default caso é avaliado somente se todos os outros padrões de caso não forem correspondidos ou se a goto default; instrução for executada em uma das seções do switch.
Você pode especificar vários padrões de maiúsculas e minúsculas para uma seção de uma switch instrução, como mostra o exemplo a seguir:
DisplayMeasurement(-4); // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50); // Output: Measured value is 50.
DisplayMeasurement(132); // Output: Measured value is 132; out of an acceptable range.
void DisplayMeasurement(int measurement)
{
switch (measurement)
{
case < 0:
case > 100:
Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
break;
default:
Console.WriteLine($"Measured value is {measurement}.");
break;
}
}
Dentro de uma switch instrução, o controle não pode cair de uma seção de switch para a próxima. Como mostram os exemplos nesta seção, normalmente você usa a break instrução no final de cada seção de switch para passar o controle para fora de uma switch instrução. Você também pode usar as instruções return e throw para passar o controle de uma switch instrução. Para imitar o comportamento de queda e passar o controle para outra seção de switch, você pode usar a goto instrução.
Importante
Cada seção de interruptor deve terminar com um break, goto ou return. Passar de uma seção de switch para a próxima gera um erro de compilador. No entanto, vários rótulos de switch podem ser aplicados à mesma seção de switch, como case < 0: no exemplo acima. Essa escolha deliberada de design permite lidar de forma concisa com vários casos que compartilham a mesma lógica ou interdependente.
Em um contexto de expressão, você pode usar a expressão para avaliar uma única expressão a partir de uma lista de expressões candidatas switch com base em uma correspondência de padrão com uma expressão.
Importante
Diferenças entre a expressão switch e a instrução switch:
- A instrução switch é usada para controlar o fluxo de execução dentro de um bloco de código.
- A expressão switch é normalmente usada em contextos de retorno de valor e atribuição de valor, geralmente como membros com corpo de expressão.
- Uma seção de caso de expressão switch não pode estar vazia, uma instrução switch pode.
Protetores de caixa
Um padrão de caso pode não ser expressivo o suficiente para especificar a condição para a execução da seção de switch. Nesse caso, você pode usar um protetor de caso. Trata-se de uma condição adicional que deve ser satisfeita juntamente com um padrão correspondente. Um guarda-caso deve ser uma expressão booleana. Você especifica um protetor de caso após a when palavra-chave que segue um padrão, como mostra o exemplo a seguir:
DisplayMeasurements(3, 4); // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5); // Output: Both measurements are valid and equal to 5.
void DisplayMeasurements(int a, int b)
{
switch ((a, b))
{
case (> 0, > 0) when a == b:
Console.WriteLine($"Both measurements are valid and equal to {a}.");
break;
case (> 0, > 0):
Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
break;
default:
Console.WriteLine("One or both measurements are not valid.");
break;
}
}
O exemplo anterior usa padrões posicionais com padrões relacionais aninhados.
Especificação da linguagem C#
Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#:
Para obter mais informações sobre padrões, consulte a seção Padrões e correspondência de padrões da especificação da linguagem C#.