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