¿Cuándo es apropiado usar miembros con cuerpo de expresión? [cerrado]

24

C # 6 introduce miembros con cuerpo de expresión, que permiten un código simplificado en métodos y propiedades que solo devuelven el resultado de una expresión:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

se convierte en:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Dado que ahora tenemos dos sintaxis exactamente equivalentes y válidas, se debe usar alguna regla general para decidir cuál usar. ¿Cuándo es apropiada la nueva alternativa?

Asik
fuente
77
Umm, cuando el cuerpo del miembro es una expresión?
Jörg W Mittag
1
Eso respondería a la pregunta "cuándo es posible usar miembros con cuerpo de expresión".
Asik
77
No está completamente relacionado, pero ¿no puedes usarlo public override string ToString() => $"{_field1} {_field2}";?
Thaoden
3
@JorgWMittag Agregaría "... eso no tiene efectos secundarios" a eso. Declarar un método en un estilo funcional cuando no es puramente funcional sería engañoso.
Jules

Respuestas:

12

Los lenguajes de programación funcional consisten solo en expresiones, por lo que la mayoría ha tenido una característica como esta desde el principio. Lo usa cuando tiene una expresión relativamente corta, a menudo repetida con frecuencia, que puede reemplazarse por un nombre aún más corto y mucho más significativo.

Un ejemplo común serían los predicados que se usan en otros lugares, como:

public static bool isOdd(int num) => (num % 2) == 1;

Si la expresión es demasiado larga, es mejor dividirla en funciones separadas o tal vez una función con resultados intermedios con nombre. Si es breve, pero no se te ocurre un buen nombre, es mejor que solo copie la expresión en lugar de crear un nombre terrible como condition1o algo así.

Karl Bielefeldt
fuente
21

De C # /. NET Little Wonders: Miembros con cuerpo de expresión en C # 6 :

Entonces, ¿deberías usar esto? Todo se reduce al estilo. Mi instinto sería limitar esto a expresiones simples y declaraciones que puedan entenderse claramente a primera vista.

(énfasis, mío; ver Actualización 1 a continuación)

Más del resumen del artículo anterior:

Entonces C # 6 ahora nos da la capacidad de especificar propiedades de solo obtención y cuerpos de métodos con expresiones. Esto puede ayudar a reducir la carga de sintaxis de métodos muy simples para hacer que su código sea más conciso.

Sin embargo, con todas las cosas, use su juicio sobre si se ajusta a cualquier situación dada. Cuando una expresión es muy larga o compleja, el uso de la sintaxis de cuerpo completo aún puede ser más legible.

Y otra cita sobre el rendimiento, porque los problemas de rendimiento también pueden influir cuando es apropiado usar una determinada función del lenguaje:

Ahora, usted puede preguntar, ¿esto tiene alguna implicación de rendimiento en tiempo de ejecución? En realidad, la respuesta es no . Esto es simplemente azúcar sintáctico que se expande en la misma IL que escribir todo el cuerpo. No , no crear un delegado, es simplemente pidiendo prestado la sintaxis de expresión lambda para simplificar la escritura de los cuerpos simples que resultan en una expresión.

(énfasis, el autor)

Actualización 1: @ JörgWMittag dijo

Esto no tiene sentido. ¿"limitar esto a expresiones y declaraciones simples"? ¿Eh? ¡Ni siquiera funciona con declaraciones, solo con expresiones!

Parece que el autor original puede tener errores de expresión. Para aclarar, de The New and Improved C # 6.0 :

Las funciones corporales de expresión son otra simplificación de sintaxis en C # 6.0. Estas son funciones sin cuerpo de declaración. En su lugar, los implementa con una expresión que sigue a la declaración de función.

Para ser claros, esto no hace que un método o propiedad sea una Expresión . Utiliza la sintaxis de Expresión para reducir las líneas de código (y los números de llaves).

Mi recomendación original sigue en pie: úsela cuando haga que su código sea obvio y más fácil de entender, no simplemente porque puede usarlo.

Greg Burghardt
fuente
2
Esto no tiene sentido. ¿"limitar esto a expresiones y declaraciones simples "? ¿Eh? ¡Ni siquiera funciona con declaraciones, solo con expresiones! Tampoco estoy convencido de que agregar desorden (dos paréntesis y una returnpalabra clave) pueda conducir a una mayor legibilidad. Después de todo, la expresión compleja sigue siendo exactamente la misma expresión compleja, simplemente enterrada en el desorden sintáctico.
Jörg W Mittag
3
Por lo que he leído, los miembros con cuerpo de expresión no son en realidad expresiones. Son azúcar sintáctico. A menos que la especificación de C # haya cambiado desde la publicación del blog, admite métodos con tipos de retorno nulo.
Greg Burghardt
1
Podría estar equivocado, pero creo que los efectos secundarios no están permitidos en las declaraciones de expresión. Entonces, para mí, el beneficio de las declaraciones de expresión es que le está diciendo al lector que esta "expresión" es pura y que no hay efectos secundarios ocultos que usted, el lector, deba buscar.
John
1
@John "no permitido" está completamente equivocado. Puede hacer todos los chanchullos como crear una acción, dentro de la declaración de acciones establecer variables miembro y luego invocar la acción. Por lo tanto, los efectos secundarios obviamente no están prohibidos. Definitivamente los desanimaría aunque, pierden el punto de la sintaxis de la expresión.
Mafii
@Mafii. Gracias. Desde entonces he aprendido que puedes hacer "declaraciones de expresión", que se describieron como "modernas". Para mí, sin embargo, la idea es confusa.
John