Instrucciones de selección if
, if-else
y switch
Las instrucciones if
, if-else
y switch
seleccionan las instrucciones que se ejecutarán a partir de muchos trazados posibles en función del valor de una expresión. La instrucción if
ejecuta una instrucción solo si una expresión booleana proporcionada se evalúa como true
. La instrucción if-else
permite elegir cuál de las dos rutas de acceso al código se deben seguir en función de una expresión booleana. 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.
Instrucción if
Una instrucción if
puede tener cualquiera de las dos formas siguientes:
Una instrucción
if
con una parteelse
selecciona 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
if
sin una parteelse
ejecuta 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ónswitch
.
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
solo se evalúa si el resto de patrones de caso no coinciden o la instrucción goto default;
se ejecuta en una de las secciones switch.
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.
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, consulte la sección Patrones y coincidencia de patrones de la especificación del lenguaje C#.