Las sentencias switch tienen una venerable historia en los lenguajes de programación. Se introdujeron en C, donde se apreciaban por su velocidad. Esa velocidad tenía como precio una funcionalidad muy limitada. En C#, el papel de la sentencia switch se ha ampliado más allá de los enteros. Las sentencias switch pueden abarcar cualquier tipo, valor o referencia arbitrarios.
Si vienes de un lenguaje funcional, trabajar con sentencias switch (y con las expresiones switch que se tratan en otra parte) es lo más cercano que encontrarás en C# al uso de uniones discriminadas y coincidencia de patrones. Sin embargo, no se acercan ni de lejos al poder de las uniones discriminadas para garantizar la seguridad de tipos.
Las sentencias switch simples se parecen a sus ancestros de C, combinando switch, case, break y default.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
El patrón anterior se puede usar con cualquier tipo simple (primitivos + strings).
Cuando se agregan tipos de referencia a la mezcla, entra en juego sintaxis adicional: primero para convertir el tipo a un subtipo y luego para agregar guardas (when), aunque las guardas se pueden usar con casos de valores simples. Esto se ilustra a continuación:
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default es opcional, pero por lo general es conveniente.break es obligatoria para cualquier cláusula case que no esté vacía.case debe derivarse del tipo del argumento de switch. Un argumento de switch de tipo Object obviamente permite el rango más amplio.case.case con argumentos case diferentes pueden referirse al mismo bloque de código.La documentación de la sentencia switch ofrece una introducción a las sentencias switch.