lunes, 26 de marzo de 2012

Analizando el Null-coalescing operator u operador ?? en C#

En mi anterior artículo sobre el operador ?? y tras un comentario sobre la legibilidad del código me surgió la duda de como resolvería internamente el compilador este operador, porque si lo resuelve como el clásico if...then...else puede que alguno prefiera esta sintaxis a la del operador ??, aunque a mi personalmente me gusta más el código limpio así que cuanto menos escriba mejor.

Para hacer la prueba usaré el siguiente código

public string ObtenerValor()
{
    return null;
}

public string Test1()
{
    if (ObtenerValor() == null)
        return "Test1";
    else
        return ObtenerValor();
}

public string Test2()
{
    return (ObtenerValor() == null ? "Test2" : ObtenerValor());
}

public string Test3()
{
    return (ObtenerValor() ?? "Test3");
}

Como vemos no se trata de un código muy complejo, simplemente simulamos una llamada a un método que he llamado ObtenerValor, que devuelve un simple null. Este método puede ser la obtención de un valor en una base de datos y llevarnos muchos segundos. Tras compilar el código lo analizamos con el IL Disassembler de lo que obtenemos lo siguiente


Ahí vemos nuestros métodos ObtenerValor, Test1, Test2 y Test3 y al hacer doble click en ellos veremos el código CIL, anteriormente llamado MSIL, que ha generado el compilador.

 Código CIL de nuestro método Test1

  Código CIL de nuestro método Test2


Código CIL de nuestro Test3

Como en código CIL del método Test1 hace dos llamadas a nuestra función ObtenerValor. El código del método Test2, aun siendo más corto que el del método Test1 sigue haciendo también dos llamadas a nuestro método ObtenerValor. El código del método Test3 nos muestra tal y como esperábamos una sola  llamada al método ObtenerValor por lo que ganamos en eficiencia en el código ejecutado y en la legibilidad del código fuente (desde mi punto de vista). Así que, ¿a qué esperamos para usar el operador ?? en todas nuestras comparaciones con null?


Para el que esté interesado en como se ejecuta cada uno de los métodos puede ver que significa cada OpCode en las referencias del artículo.


Happy coding!

Mas info | Código CIL | OpCodes Fields

No hay comentarios:

Publicar un comentario