martes, 18 de noviembre de 2014
Seguimos hablando de las novedades de C# 6, y en esta ocasión nos centraremos en una interesante característica cuyo nombre, sinceramente, no estoy seguro de ser capaz de traducir de forma correcta del original “Expression bodied function members”. Quizás sería algo así como “expresiones en cuerpo de miembros de función”, pero bueno, lo importante no es el nombre sino el concepto, así que vamos a centrarnos en él.
Comencemos desde el principio. Los miembros de función son aquellos miembros de un tipo que contienen código ejecutable, como métodos, propiedades, indexadores, operadores y otros. En general, todos ellos permiten implementar su comportamiento mediante la introducción de un bloque de código, tradicionalmente enmarcado entre llaves.
Pues bien, esta novedad del lenguaje permite sustituir el cuerpo de miembros de función por una concisa expresión lambda, logrando simplificar bastante el código y acelerando su creación.
Pero veámoslo con un ejemplo. Observad la siguiente clase, y más concretamente la cantidad de caracteres necesarios para implementar su propiedad de sólo lectura
A partir de C# 6, podremos dejarla así de limpita:
Genial, ¿verdad? De un plumazo hemos eliminado muchísimo ruido de nuestro código, mejorando la legibilidad y evitando gran cantidad de golpes de tecla. Observad que incluso hemos eliminado el bloque
Aunque la lambda del ejemplo anterior es simplemente una expresión de concatenación, al codificarla podríamos usar cualquier tipo de expresión, y desde ella tendremos acceso a cualquier miembro que también tuviéramos disponible al usar la sintaxis tradicional, como sus demás miembros de instancia o estáticos, privados o públicos.
De nuevo volviendo al ejemplo anterior, hemos mostrado cómo reescribir una propiedad, pero por supuesto podemos hacer lo mismo con métodos. Esto será especialmente interesante para simplificar aquellos cuyo cuerpo sólo tengamos una línea con un
Bueno, y como podréis imaginar también podemos usar esta sintaxis con métodos estáticos:
Quizás la única precaución que hay que tener en cuenta es que en el caso de miembros de función que retornan
También los operadores personalizados o implícitos son buenos candidatos a utilizar esta sintaxis reducida, puesto que su cuerpo consiste muy a menudo en una simple expresión de evaluación directa:
Asimismo, otro buen sitio para utilizarlo sería en los miembros indexadores:
Aunque pueda parecer obvio, un último detalle que creo interesante resaltar es que estas expresiones, a diferencia de las lambda tradicionales, no pueden tener cuerpo, es decir, no podemos usar llaves e incluir en su interior varias instrucciones. La verdad es que esto tiene bastante sentido porque en caso de necesitar un cuerpo ya tenemos la sintaxis anterior; esta nueva fórmula viene a ayudarnos cuando el cuerpo de un miembro de función es una simple expresión de evaluación directa.
En definitiva, de nuevo se trata de una mejora del lenguaje nada espectacular, pero sin duda interesante vistas a simplificar código y evitar pulsaciones de teclas innecesarias. En mi opinión será bien recibida y pronto tendrá bastantes adeptos.
Y por último, recordaros los posts anteriores de la serie por si queréis conocer otras novedades que acompañarán a C# 6:
Comencemos desde el principio. Los miembros de función son aquellos miembros de un tipo que contienen código ejecutable, como métodos, propiedades, indexadores, operadores y otros. En general, todos ellos permiten implementar su comportamiento mediante la introducción de un bloque de código, tradicionalmente enmarcado entre llaves.
Pues bien, esta novedad del lenguaje permite sustituir el cuerpo de miembros de función por una concisa expresión lambda, logrando simplificar bastante el código y acelerando su creación.
Pero veámoslo con un ejemplo. Observad la siguiente clase, y más concretamente la cantidad de caracteres necesarios para implementar su propiedad de sólo lectura
FullName
en C# tradicional:A partir de C# 6, podremos dejarla así de limpita:
Genial, ¿verdad? De un plumazo hemos eliminado muchísimo ruido de nuestro código, mejorando la legibilidad y evitando gran cantidad de golpes de tecla. Observad que incluso hemos eliminado el bloque
get
, implícito cuando usamos la sintaxis lambda en una propiedad.Aunque la lambda del ejemplo anterior es simplemente una expresión de concatenación, al codificarla podríamos usar cualquier tipo de expresión, y desde ella tendremos acceso a cualquier miembro que también tuviéramos disponible al usar la sintaxis tradicional, como sus demás miembros de instancia o estáticos, privados o públicos.
De nuevo volviendo al ejemplo anterior, hemos mostrado cómo reescribir una propiedad, pero por supuesto podemos hacer lo mismo con métodos. Esto será especialmente interesante para simplificar aquellos cuyo cuerpo sólo tengamos una línea con un
return
; como muestra, fijaos que controladores MVC más bonitos podríamos escribir en escenarios simples:Bueno, y como podréis imaginar también podemos usar esta sintaxis con métodos estáticos:
Quizás la única precaución que hay que tener en cuenta es que en el caso de miembros de función que retornan
void
también podemos utilizar las lambdas, aunque en su interior sólo podremos usar expresiones sin retorno, al igual que ocurre con las lambdas tradicionales:También los operadores personalizados o implícitos son buenos candidatos a utilizar esta sintaxis reducida, puesto que su cuerpo consiste muy a menudo en una simple expresión de evaluación directa:
Asimismo, otro buen sitio para utilizarlo sería en los miembros indexadores:
Aunque pueda parecer obvio, un último detalle que creo interesante resaltar es que estas expresiones, a diferencia de las lambda tradicionales, no pueden tener cuerpo, es decir, no podemos usar llaves e incluir en su interior varias instrucciones. La verdad es que esto tiene bastante sentido porque en caso de necesitar un cuerpo ya tenemos la sintaxis anterior; esta nueva fórmula viene a ayudarnos cuando el cuerpo de un miembro de función es una simple expresión de evaluación directa.
En definitiva, de nuevo se trata de una mejora del lenguaje nada espectacular, pero sin duda interesante vistas a simplificar código y evitar pulsaciones de teclas innecesarias. En mi opinión será bien recibida y pronto tendrá bastantes adeptos.
Y por último, recordaros los posts anteriores de la serie por si queréis conocer otras novedades que acompañarán a C# 6:
- El operador “?.” en C# y VB.NET, más cerca
- Inicialización de propiedades en C# 6.0
- Uso de miembros estáticos en C# 6, ¿una buena idea?
- Declaración de variables en expresiones de C# 6
- El operador nameof de C# 6 y rendimiento del operador nameof.
- Inicialización de diccionarios en C# 6
- Mejoras en bloques try/catch de C# 6
4 Comentarios:
No me gusta nada esta opción. De acuerdo que facilita la escritura pero dificulta mucho la lectura, mezcla conceptos de una forma negativa. Las expresiones lambdas se asocian a funciones, acciones, métodos y delegados, no a propiedades. Esta nueva forma de utilizar las lambdas exige más esfuerzo al leer para identificar qué hace.
Lo que yo hago con las propiedades: tengo creados "snippets" y con cuatro pulsaciones del tabulador más teclear algún nombre o valor devuelto lo tengo hecho.
Hola!
Entiendo tu punto de vista.
La verdad es que al principio desconcierta un poco porque es una sintaxis nueva, pero creo que será buena para la legibilidad en cuanto nos acostumbremos a ella. En mi opinión, cuanta más información podamos obtener de un simple vistazo, mucho mejor :)
Gracias por comentar!
Comparto tu punto José solo es cuestión de acostumbrarse a leerlo, sin ser algo tan elevado, es lo mismo que ocurre cuando nos encontramos con un operador ternario en lugar de un bloque if ó bien cuando declaras una variable en una línea y en la siguiente le asignamos un valor.
Muchos evitaremos hacer el camino de una sola lína porque es mas entendible hacerlo todo en pasas mas detallados, pero conforme va pasando el tiempo prefieres escribir la misma acción con menos código
Por otro lado que bueno que das a conocer la existencia de esta característica ya que muchas veces nos toca mantener códigos legados y esto nos ayuda a entender lo que algunos de nuestros predecesores escribieron ya que no necesariamente el hecho de ser el sucesor de alguien implica que conozcas mas el lenguaje que tu predecesor
Para nada dificulta la lectura, al contrario, lo que pasa es que estamos acostumbrados a tener las llaves y si no las hay tendemos a creer que no es un método o una propiedad.
Este tipo de notación es mas conocido en los lenguajes funcionales.
Yo los uso ya en todo el código donde puedo, aunque yo hago un pequeñisimo cambio, en vez de escribir:
public int Suma(int a, int b) => a + b;
escribo:
public int Suma(int a, int b)
=> a + b;
Al menos a mi me gusta como queda.
Enviar un nuevo comentario