> Manuales > Manual sobre la plataforma .Net

Este operador, introducido en la especificación de C# 2.0, es un complemento perfecto para los tipos anulables al facilitar el tratamiento de valores nulos.

Una de las preguntas típicas que se hacen las personas que están aprendiendo .NET con el Manual de desarrollo en .NET de DesarrolloWeb.com es sobre el operador ??. Este artículo te pondrá en antecedentes y te explicará todo sobre el "null coalescing operator", del que ya había hablado en otras ocasiones en mi blog VariableNotFound.

El operador en cuestión, expresado como ?? (dos cierres de interrogación), permite devolver un valor si no es nulo, o devolver otro valor alternativo ante la nulidad del primero. En otras palabras, un código como:

if (s!=null)
    return s;
else
    return "por defecto";

O también escrito de la forma, utilizando el operador ternario:

return (s!=null?s:"por defecto");

Quedaría, utilizando el nuevo operador de fusión, como:

return s ?? "por defecto";

Como podréis comprobar, el resultado es un código bastante limpio y conciso.

A primera vista puede parecer que salvo mejorar la legibilidad no aporta demasiadas ventajas frente al operador ternario “?”, pero fijaos en el siguiente código, en un método que retorna el nombre de algo cuyo identificador le llega como parámetro:

string nombre = obtenerNombre(id);
if (nombre==null)
    return "Desconocido";
else
    return nombre;

Utilizando el operador ternario ? podríamos dejarlo en una única línea:

return obtenerNombre(id)==null?"Desconocido":obtenerNombre(id);

Esto tiene una pega aparte de la dificultad de lectura: si el nombre es nulo, llamaremos dos veces a obtenerNombre(id), lo cual podría tener efectos secundarios no deseados, o simplemente causar un problema de rendimiento. Para mejorarlo podríamos hacer esto, que mejora la legibilidad y llama sólo una vez al método, aunque es más largo de codificar, siendo muy similar al if inicial:

string p = obtenerNombre(id);
return p==null? "Desconocido": p;

Con el nuevo operador el código quedaría así de simple:

return obtenerNombre(id) ?? "Desconocido";

Esto se ejecuta de la siguiente forma: se llama a obtenerNombre(id) y si no es nulo se retorna el valor obtenido. Sólo si el resultado de la expresión ha sido nulo se retornaría el literal "Desconocido".

Como es de esperar, la expresión alternativa sólo es evaluada cuando al evaluar la primera se ha obtenido un nulo. En el siguiente código, obtenerAlternativo() sólo será invocado cuando obtenerNombre() haya retornado null:

return obtenerNombre(id) ?? obtenerAlternativo(id);

En definitiva, se trata de un operador muy útil y no demasiado conocido que conviene tener en cuenta para conseguir un código más limpio y eficaz.

Publicación original: http://www.variablenotfound.com/2007/04/el-operador-en-c-null-coalescing.html

José María Aguilar

Consultor y desarrollador independiente, Most Valuable Professional (MVP) en ASP...

Manual