Instrucciones de selección (referencia de C#)
Las instrucciones siguientes seleccionan las instrucciones que se ejecutarán a partir de una serie de instrucciones posibles en función del valor de una expresión:
- La instrucción
ifselecciona una instrucción para ejecutarla en función del valor de una expresión booleana. - La instrucción
switchselecciona una lista de instrucciones para ejecutarla en función de la coincidencia de un patrón con una expresión.
Instrucción if
Una instrucción if puede tener cualquiera de las dos formas siguientes:
Una instrucción
ifcon una parteelseselecciona una de las dos instrucciones que se ejecutarán en función del valor de una expresión booleana, como se muestra en el ejemplo siguiente: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!"); } }Una instrucción
ifsin una parteelseejecuta el cuerpo solo si una expresión booleana se evalúa comotrue, como se muestra en el ejemplo siguiente: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}"); }
Puede anidar instrucciones if para comprobar varias condiciones, como se muestra en el ejemplo siguiente:
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}");
}
}
En un contexto de expresión, puede usar el operador condicional ?: para evaluar una de las dos expresiones en función del valor de una expresión booleana.
Instrucción switch
La instrucción switch selecciona una lista de instrucciones para ejecutarla en función de la coincidencia de un patrón con una expresión de coincidencia, como se muestra en el ejemplo siguiente:
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;
}
}
En el ejemplo anterior, una instrucción switch usa los siguientes patrones:
- Un patrón relacional para comparar el resultado de una expresión con una constante.
- Una patrón de constante para probar si el resultado de una expresión es igual a una constante.
Importante
Para obtener información sobre los patrones admitidos por la instrucción switch, consulte Patrones.
En el ejemplo anterior también se muestra el caso default. El caso default especifica las instrucciones que se ejecutarán cuando una expresión de coincidencia no coincida con ningún otro patrón de caso. Si una expresión de coincidencia no coincide con ningún patrón de caso y no hay ningún caso default, el control pasa por una instrucción switch.
Una instrucción switch ejecuta la lista de instrucciones en la primera sección de switch cuyo patrón de caso coincida con una expresión de coincidencia y cuya restricción de caso, de haberla, se evalúe como true. Una instrucción switch evalúa los patrones de casos en el orden de texto de arriba a abajo. El compilador genera un error cuando una instrucción switch contiene un caso inaccesible. Ese es un caso que ya se controla mediante un caso superior o cuyo patrón es imposible de hacer coincidir.
Nota
El caso default puede aparecer en cualquier lugar de una instrucción switch. Independientemente de su posición, el caso default siempre se evalúa por último y solo si no coinciden todos los demás patrones de caso.
Puede especificar varios patrones de casos para una sección de una instrucción switch, como se muestra en el ejemplo siguiente:
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 una instrucción switch, el control no puede pasar desde una sección switch a la siguiente. Como se muestra en los ejemplos de esta sección, normalmente se usa la instrucción break al final de cada sección switch para pasar el control desde una instrucción switch. También puede usar las instrucciones return y throw para pasar el control desde una instrucción switch. Para imitar el comportamiento de pasaje explícito y pasar el control a otra sección switch, puede usar la instrucción goto.
En el contexto de una expresión, puede usar la expresión switch para evaluar una expresión única a partir de una lista de expresiones candidatas basada en una coincidencia de patrón con una expresión.
Restricciones de mayúsculas y minúsculas
Un patrón de caso puede no ser lo suficientemente expresivo como para especificar la condición para la ejecución de la sección switch. En tal caso, puede usar una restricción de caso. Se trata de una condición adicional que debe cumplirse junto con un patrón coincidente. Una restricción de caso debe ser una expresión booleana. Especifique una restricción de mayúsculas y minúsculas después de la palabra clave when que sigue un patrón, como se muestra en el ejemplo siguiente:
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;
}
}
En el ejemplo anterior se usan patrones posicionales con patrones relacionales anidados.
Compatibilidad con versiones del lenguaje
La instrucción switch admite la coincidencia de patrones a partir de C# 7.0.
En C# 6 y versiones anteriores, se usa la instrucción switch con las siguientes limitaciones:
- Una expresión de coincidencia debe tener uno de los tipos siguientes: char, string, bool, un tipo numérico entero o un tipo de enumeración.
- Solo se permiten expresiones constantes en las etiquetas
case.
Especificación del lenguaje C#
Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:
Para más información sobre las características presentadas en C# 7.0 y versiones posteriores, vea las siguientes notas de propuesta de características: