C# 8.0: Expresiones switch

Otra de las adiciones a C# 8.0 que se extrañaban desde hace mucho tiempo y cuya llegada se agradece son las expresiones switch (switch expressions). Una buena parte de las sentencias switch que ponemos en nuestro código fuente tiene como único objetivo computar un valor en dependencia de otro, y el uso de una sentencia switch en tales casos (aunque siempre una mejora en legibilidad y elegancia en comparación con el uso de la cascada equivalente de sentencias ifelse) recuerda la verborrea innecesaria de muchos políticos.

Ya uno de los ancestros que más han influido en los lenguajes modernos, Algol 68 (definido en 1968, claro), incluía esta característica. Por ejemplo, observe cómo lucía en este lenguaje una función para determinar la cantidad de días en un mes (tomada de Wikipedia):

proc days in month = (int year, month) int:
  case month in
    31,
    if year mod 4 eq 0 and year mod 100 ne 0 or year mod 400 eq 0 then 29 else 28 fi,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  esac;

Una versión parecida en C# 8.0 que utiliza una expresión switch podría ser la siguiente:

public static int DaysInMonth(int month, int year) => month switch
{
    4 => 30, 6 => 30, 9 => 30, 11 => 30,
    2 => (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 29 : 28,
    _ => 31,
};

Observe cómo en estas expresiones la palabra reservada switch se utiliza de manera infija entre la variable (o expresión) según cuyo valor se discrimina y el bloque que contiene la secuencia de pares de expresiones (valor => resultado), y cómo la palabra reservada default se sustituye convenientemente por el comodín _. El resultado de la expresión switch en su conjunto será el resultado de la evaluación de la parte derecha cuya parte izquierda “case” con el valor discriminante. Si en tiempo de ejecución se analiza toda la lista sin que se encuentre una parte izquierda coincidente, se lanzará una excepción de tipo SwitchExpressionException (espacio de nombres System.Runtime.CompilerServices). El compilador hará lo mejor que pueda para advertirle de antemano de tal posibilidad.

Como ya seguramente sabe el lector, la máxima expresividad al utilizar una expresión switch se obtiene cuando se la combina con el uso de patrones (patterns). Para leer más sobre los patrones que fueron incorporados al lenguaje en C# 7.x, puede consultar mis entradas anteriores Patrones en C# 7.0, La sentencia switch en C# 7.0 y La sentencia switch en C# 7.0 (y 2). Estos artículos le pueden servir de introducción a una próxima entrega que describirá los nuevos patrones incorporados a C# 8.0. Si no puede o no quiere esperar, le recomiendo sinceramente la serie de artículos sobre C#8.0 que publicó en este mismo sitio mi colega Jorge Serrano.

Octavio Hernandez

Desarrollador y consultor en tecnologías .NET. Microsoft C# MVP entre 2004 y 2010.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *