jueves, 15 de marzo de 2012

Null-coalescing operator u operador ?? en C#

El operador ?? o null-coalescing operator se utiliza para definir un valor predeterminado para los tipos de valor que aceptan valores NULL así como los tipos de referencia. Dicho operador devuelve el operando izquierdo si es NOT NULL; en los demás casos, devuelve el operando derecho. Dicho de otra manera, devuelve el operando izquierdo si es not-null, en los demás casos devuelve el operando derecho.

De esta manera el siguiente código
if (p == null)
  return "default";
else
  return p;
Que tambíen puede ser escrito así
return (p == null ? "default" : p);
Se podría escribir de la siguiente manera
return (p ?? "default");
Como vemos, el código es mucho más limpio y legible. Ahora veamos otro pequeño ejemplo donde el operador ?? nos puede ser útil.
string p = obtenerValor();
if (p == null)
  return "default";
else
  return p;
Supongamos que la llamada al método obtenerValor() es una llamada costosa con multiples accesos a datos y complejos cálculos en memoria y cometieramos el error de por legibilidad usar el operar ?
return (obtenerValor() == null ? "default" : obtenerValor());
Vemos que en este caso hemos mejorado la legibilidad del código pero hemos empeorado considerablemente la eficiencia de nuestro código ya que en muchos casos haremos dos llamadas al método obtenerValor. En este caso el operador ?? viene a nuestro rescate quedando el código de la siguiente manera
return (obtenerValor() ?? "default");
Happy coding!

Más referencias | El operador ??

3 comentarios:

  1. Vaya, me gusta como queda. Un poco dependiente del lenguaje, pero nadie ha dicho que no haya que conocer el lenguaje previamente. Basicamente se podría resumir en el operador devuelve un valor por defecto si es null :-)

    ResponderEliminar
  2. Efectivamente es eso, devolver un valor por defecto si es null. La duda que me queda es como transformará el compilador ese código, porque si al final se traduce en un if..then...else no le veo la ganancia.

    ResponderEliminar
    Respuestas
    1. Pues no tengo ni idea y menos fuera del mundo Java. Pero siendo algo que se ha de analizar en tiempo de ejecución, no te extrañe que el mecanismo interno puede ser algo así.

      Tampoco hay que darle muchas vueltas, computacionalmente la operación seguro que tiene un coste despreciable, por lo que yo sigo creyendo que la legibilidad prima.

      Eliminar