Descartes en C# 7.0

“Don’t discard me / Just because you think I mean you harm …”
Elton John, “Don’t let the sun go down on me” (1974)

Entre las nuevas características de lenguaje incorporadas a C# 7.0, una relativamente sencilla que ha llamado mi atención son los descartes (discards). Según dice Matt Torgersen en las notas sobre el diseño de C#, el cambio del término que estaba previsto, wildcards, por discards (para mí tremendamente acertado), fue propuesto al equipo de C# durante el último MVP Summit celebrado en Seattle.

Creo que descarte es el término castellano que debiéramos utilizar, vistas sus acepciones en el diccionario de la Real Academia Española: “1) Acción de descartar o descartarse. 2) En varios juegos de naipes, cartas que se desechan o quedan sin repartir”. Y espero sinceramente que dentro de una o dos décadas, cuando se enseñe a programar desde la más tierna infancia, se añada al diccionario un nuevo significado para esta palabra: “En ciertos lenguajes de programación, nombre que se da a variables locales de solo escritura generadas por el compilador”.

Básicamente, los descartes nos ahorran la necesidad de asignarle explícitamente un nombre a una variable que no vamos a utilizar después de su primera aparición en el código fuente (en la que se le asigna un valor). Me recuerdan a una característica muy parecida que ofreció desde sus inicios el lenguaje de programación lógica Prolog (donde también se utiliza un simple subrayado para denotar a los descartes), aunque allí la cosa va de unificación bidireccional, y no de la simple asignación.

El ejemplo más típico de uso de los descartes es probablemente el relacionado con el parámetro out que ofrecen las diferentes implementaciones de TryParse() diseminadas a lo largo de las librerías de .NET Framework. Si nuestro único interés es validar la cadena de caracteres de entrada, entonces no es necesario que nos preocupemos por dar nombre a la variable que recibirá el valor interpretado correspondiente. El pequeño programa a continuación muestra, de hecho, dos posibles maneras de hacer más concisa la notación al trabajar con parámetros de salida en la última versión de C#:

namespace Geeks
{    
    class TestBed
    {
        static void Main(string[] args)
        {
            string test = "32A";
 
            Console.WriteLine(IsValidInt6(test));
            Console.WriteLine(IsValidInt7A(test));
            Console.WriteLine(IsValidInt7B(test));
        }
 
        static bool IsValidInt6(string s)  // C# 6 y anteriores
        {
            int temp;
            return int.TryParse(s, out temp);
        }
        static bool IsValidInt7A(string s)  // C# 7.0 
        {
            return int.TryParse(s, out int temp);
        }
        static bool IsValidInt7B(string s)  // C# 7.0
        {
            return int.TryParse(s, out _);
        }
    }
}

Otros contextos en los que los descartes pueden ser de utilidad tienen relación con otras novedades de C# 7.0: las nuevas posibilidades de la sentencia switch y el emparejamiento de patrones (pattern matching). Pero esos son temas para próximas entradas, así que lo dejaremos aquí por ahora; no sin antes mencionar que a partir de C# 7.0 el lexema _ es una nueva palabra reservada contextual, y que su utilización en contextos en los que se encuentre definida una variable local con ese mismo nombre puede provocar problemas como los que se describen aquí.


Referencia musical: ¿Qué decir sobre Elton John que no se haya escrito ya? Un genio como pocos ha habido, durante la década de los ’70 publicó (siempre con la inestimable colaboración de su letrista, Bernie Taupin) discos que hoy son clásicos del pop/rock a razón de dos por año, hasta que llegó a los diez que necesitaba para cumplir su contrato con MCA e independizarse. Y aunque, en general, los discos que siguieron no han estado a la altura de aquellos otros (¿puede la libertad ser contraproducente, amigo lector?), Elton ha conseguido mantener su popularidad hasta el presente. El tema “Don’t let the sun go down on me” apareció originalmente en el disco “Caribou” (1974); pero solo llegó al número 1 de las listas en 1991, gracias a una versión a dúo con el ya fallecido George Michael.