Propuesta de validación sucinta de argumentos nulos en C# 11

“Workin’ from seven to eleven every night
It really makes life a drag
I don’t think that’s right…”
Led Zeppelin, “Since I’ve Been Loving You” (1970)

¿Cómo? ¿Que ya sale C# 11? Sí que el tiempo vuela… Y todavía más rápido si te lo pasas trabajando de sol a sol, a pesar de lo que parece sugerir Led Zeppelin en la referencia musical de hoy.

Aunque nunca llegué a escribir nada sobre algunas de las anteriores, me tiraré «directamente a la piscina» con las características propuestas para esta nueva versión. A fin de cuentas, tenía mucha razón mi gran amigo Vicente cuando me decía que «al desarrollo no se le puede caer atrás, porque nunca lo alcanzas; hay que montársele encima».

Como se ha hecho característico en las últimas versiones, la mayor parte de las novedades propuestas para C# 11 son pequeñas incorporaciones, y no cosas revolucionarias como los tipos por referencia anulables de C# 8 (a los que dedicamos hace un tiempo varias entradas, la primera de las cuales es ésta). Está claro que ya queda mucho menos que inventar con respecto a los tiempos en que, como dijera Kansas, «the world was young«.

Empezaré hablando hoy de una pequeña adición que podría ahorrarnos una buena cantidad de líneas de código en el prólogo de los métodos que se encarga de validar los argumentos de entrada. Para probar el código que se ofrece aquí y en las entradas que vendrán después, deberá tener instalada la versión 17.1 o posterior de Visual Studio 2022, y además asignar el valor «preview» a la propiedad LangVersion del proyecto:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
    </PropertyGroup>
</Project>

Una buena parte de nuestros métodos actuales comienzan validando que los valores de los argumentos de tipos por referencia (y note que los tipos anulables como int? son también tipos por referencia) no sean nulos. El siguiente podría ser un ejemplo trivial:

static string Cleanse(string s)
{
    if (s is null)
    {
        throw new ArgumentNullException(nameof(s));
    }
    return s.Trim().ToUpper();
}

Console.WriteLine(Cleanse("\tHello, World!\n"));

C# 11 propone introducir un nuevo operador, !!, (pronunciado bang-bang), que aplicado a un parámetro formal en la declaración del método le indicaría al compilador que genere automáticamente el código de validación de nulidad para el argumento correspondiente, exactamente igual a como hacemos manualmente ahora. Aprovechando esta novedad, el método presentado anteriormente quedaría así:

static string Cleanse(string s!!)
{
    return s.Trim().ToUpper();
}

Esta propuesta es en principio independiente de los tipos por referencia anulables, y coexiste pacíficamente con ellos. Cuando se combine el operador !! con un parámetro de tipo anulable, el compilador nos ofrecerá una advertencia que antes no existía:

En el caso de que varios parámetros de la función estén anotados con !!, las validaciones se generarán en el mismo orden en que los parámetros han sido declarados. El código de validación generado automáticamente se ejecutará antes que todo el código situado en el cuerpo del método, y para el caso de los constructores, antes de cualquier inicialización de campos o llamada a un constructor de la clase base (mediante base) o de la propia clase (mediante this).  Y aquí es donde existe una diferencia sutil con el comportamiento anterior: nuestras validaciones añadidas manualmente se ejecutan siempre después de las acciones anteriores. Analice cuidadosamente su código antes de aplicar esta novedad para asegurarse de que no está alterando la semántica de sus constructores. El equipo de C# dice que esos casos en la práctica se presentan con poca frecuencia. No obstante, ¡queda avisado!

Puede obtener más detalles sobre esta nueva propuesta en la excelente presentación de Katleen Dollard sobre las novedades de C# 11.

Octavio/Октавио/奥克塔维奥


Referencia musical: A estas alturas, Led Zeppelin no necesita presentación alguna. Solo nos queda alegrarnos a los que tuvimos la suerte de crecer oyendo su música. El blues «Since I’ve Been Loving You» es de mis preferidas del disco Led Zeppelin III (1970).

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 *