Cómo usar la declaración switch en C#

Resumen: en este tutorial, aprenderás a usar la declaración switch de C#
para seleccionar un bloque para su ejecución si una expresión coincide con una patrón.
Introducción a la declaración switch de C#
La instrucción switch evalúa una expresión y selecciona un bloque de código para su ejecución si la expresión cumple una condición. La sintaxis de la sentencia switch
es la siguiente:
switch (expression)
{
case label1:
// block1;
break;
case label2:
// block2;
break;
case label3:
// block3;
break;
default:
// blockn;
break;
}
En esta sintaxis, la declaración switch
busca de arriba hacia abajo que expression coincida con una de las label1
, label2
, label3
...
Si expression
coincide con un label
, la declaración switch
ejecutará el bloque de código correspondiente y pasará el control a la siguiente declaración.
Si expression
no coincide con ningún label
, la declaración de cambio ejecuta el bloque de código en la cláusula default
.
La cláusula default
es opcional. Si no lo especificas y la expresión no coincide con ningún label
, la declaración switch
no ejecuta ningún bloque y pasa el control a la declaración posterior.
La declaración switch
utiliza muchos patrones para hacer coincidir la expresión con las etiquetas. En este tutorial, se centrará en los siguientes patrones:
- Patrón constante: prueba si el resultado de la expresión es igual a una constante.
- Patrón relacional: compara el resultado de la expresión con una constante utilizando un operador relacional como <, <=, >, >=.
Ejemplo del uso de switch en C#
El siguiente programa usa la instrucción switch
para mostrar el nombre del mes según el número de mes ingresado por los usuarios:
Console.Write("Captura un mes (1-12): ");
int month = Convert.ToInt32(Console.ReadLine());
string name;
switch (month)
{
case 1:
name = "Ene";
break;
case 2:
name = "Feb";
break;
case 3:
name = "Mar";
break;
case 4:
name = "Abr";
break;
case 5:
name = "May";
break;
case 6:
name = "Jun";
break;
case 7:
name = "Jul";
break;
case 8:
name = "Ago";
break;
case 9:
name = "Sep";
break;
case 10:
name = "Oct";
break;
case 11:
name = "Nov";
break;
case 12:
name = "Dic";
break;
default:
name = "Mes no válido";
break;
}
Console.WriteLine(name);
Cómo funciona.
Primero, solicita a los usuarios que ingresen un número del 1
al 12
:
Console.Write("Captura un mes (1-12): ");
int month = Convert.ToInt32(Console.ReadLine());
En segundo lugar, haz coincidir el número del mes de entrada con un número del 1
al 12
utilizando la declaración switch
y asigna el nombre del mes correspondiente.
Si el número del mes no está en el rango de 1 a 12, el nombre del mes será "Mes no válido
":
string name;
switch (month)
{
case 1:
name = "Ene";
break;
case 2:
name = "Feb";
break;
case 3:
name = "Mar";
break;
case 4:
name = "Abr";
break;
case 5:
name = "May";
break;
case 6:
name = "Jun";
break;
case 7:
name = "Jul";
break;
case 8:
name = "Ago";
break;
case 9:
name = "Sep";
break;
case 10:
name = "Oct";
break;
case 11:
name = "Nov";
break;
case 12:
name = "Dic";
break;
default:
name = "Mes no válido";
break;
}
Tercero, muestra el nombre del mes:
Console.WriteLine(name);
Agrupdar casos en el uso de switch en C#
Si tiene el mismo bloque que corresponde a varios casos, puedes agrupar casos en la declaración switch
de esta manera:
switch (expression)
{
case firstCase:
case secondCase:
// block 1
break;
case thirdCase:
case fourthCase:
// block 2
break;
default:
// block n
break;
}
En esta sintaxis, la declaración switch
ejecutará el bloque 1 si expression
coincide con el primer caso (firstCase
) o el segundo caso (secondCase
). Asimismo, ejecutará el bloque 2 si expression coincide con el tercer caso (thirdCase
) o el cuarto caso (fourthCase
).
Si la expresión no coincide con ninguna etiqueta en las cláusulas del caso, ejecutará el bloque n en la cláusula default
.
El siguiente ejemplo solicita a los usuarios que ingresen un número de mes y muestren el nombre del trimestre correspondiente de ese mes:
Console.Write("Captura un mes (1-12): ");
int month = Convert.ToInt32(Console.ReadLine());
string quarter;
switch (month)
{
case 1:
case 2:
case 3:
quarter = " Trimestre 1";
break;
case 4:
case 5:
case 6:
quarter = " Trimestre 2";
break;
case 7:
case 8:
case 9:
quarter = " Trimestre 3";
break;
case 10:
case 11:
case 12:
quarter = " Trimestre 4";
break;
default:
quarter = "Trimestre inválido";
break;
}
Console.WriteLine(quarter);
Cómo funciona.
Primero, solicita a los usuarios que ingresen un número de mes del 1 al 12:
Console.Write("Captura un mes (1-12): ");
int month = Convert.ToInt32(Console.ReadLine());
En segundo lugar, establece el trimestre en función del número de mes utilizando la declaración switch
con casos grupales:
switch (month)
{
case 1:
case 2:
case 3:
quarter = " Trimestre 1";
break;
case 4:
case 5:
case 6:
quarter = " Trimestre 2";
break;
case 7:
case 8:
case 9:
quarter = " Trimestre 3";
break;
case 10:
case 11:
case 12:
quarter = " Trimestre 4";
break;
default:
quarter = "Trimestre inválido";
break;
}
Tercero, muestra el trimestre:
Console.WriteLine(quarter);
Ejemplo de declaración switch de C# con patrón de relación
A partir de C# 9, puedes usar el operador relacional >, >=, <, <= para hacer coincidir el resultado de la expresión con constantes en la declaración switch
.
Reescribiremos el programa de cálculo del índice de masa corporal (IMC) que utilizamos en el tutorial de sentencia if else if usando la sentencia switch
con el patrón relacional:
Console.WriteLine("Body Mass Index (BMI) Calculation");
Console.WriteLine("Enter a weight (kg):");
var weight = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter a height (m):");
var height = Convert.ToDouble(Console.ReadLine());
double bmi = weight / (height * height);
string weightStatus = "";
switch (bmi)
{
case < 18.5:
weightStatus = "Underweight";
break;
case >= 18.5 and <= 24.9:
weightStatus = "Healthy Weight";
break;
case >= 25 and <= 29.9:
weightStatus = "Overweight";
break;
case > 30:
weightStatus = "Obesity";
break;
}
Console.WriteLine($"BMI: {bmi:0.#}");
Console.WriteLine($"Weight status:{ weightStatus}");
Cómo funciona.
Primero, solicita a los usuarios que ingresen el peso en kg y la altura en metros:
Console.WriteLine("Body Mass Index (BMI) Calculation");
Console.WriteLine("Enter a weight (kg):");
var weight = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter a height (m):");
var height = Convert.ToDouble(Console.ReadLine());
Segundo, calcula el IMC tomando el peso dividido por el cuadrado de la altura:
double bmi = weight / (height * height);
En tercer lugar, asigna el estado del peso en función del valor del IMC:
string weightStatus = "";
switch (bmi)
{
case < 18.5:
weightStatus = "Underweight";
break;
case >= 18.5 and <= 24.9:
weightStatus = "Healthy Weight";
break;
case >= 25 and <= 29.9:
weightStatus = "Overweight";
break;
case > 30:
weightStatus = "Obesity";
break;
}
Finalmente, muestra el estado de IMC y el estatus del peso:
Console.WriteLine($"BMI: {bmi:0.#}");
Console.WriteLine($"Weight status:{ weightStatus}");
Como puedes ver, la sentencia switch es mucho más legible que la sentencia if else if.
Resumen
- Use la instrucción
switch
para ejecutar un bloque si una expresión coincide con un patrón. - La instrucción
switch
utiliza muchos patrones coincidentes. - El patrón constante comprueba si el resultado de la expresión es igual a una constante.
- El patrón relacional prueba el resultado de la expresión con una constante utilizando el operador relacional <, <=, >, >=.
- Un caso de grupo te permite ejecutar el mismo bloque que corresponde a varios casos.
- La instrucción
switch
ejecuta el bloque en la cláusula default si la expresión no coincide con ningún caso. La cláusula default es opcional.