Quando é apropriado usar membros com expressão corporal? [fechadas]


24

O C # 6 apresenta membros com expressão, que permitem código simplificado em métodos e propriedades que retornam apenas o resultado de uma expressão:

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

torna-se:

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

Como agora temos duas sintaxes exatamente equivalentes e válidas, algumas regras práticas devem ser usadas para decidir qual usar. Quando a nova alternativa é apropriada?


7
Hum, quando o corpo do membro é uma expressão?
Jörg W Mittag

1
Isso responderia à pergunta "quando é possível usar membros com expressão corporal".
Asik

7
Não está completamente relacionado, mas você não pode usar public override string ToString() => $"{_field1} {_field2}";?
Thaoden

3
@JorgWMittag eu adicionaria "... que não tem efeitos colaterais" a isso. Declarar um método em um estilo funcional quando não é puramente funcional seria enganoso.
Jules

Respostas:


12

As linguagens de programação funcional consistem apenas em expressões; portanto, a maioria possui um recurso como este desde o início. Você o usa quando tem uma expressão relativamente curta, frequentemente repetida com frequência, que pode ser substituída por um nome ainda mais curto e muito mais significativo.

Um exemplo comum seria predicados usados ​​em outros lugares, como:

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

Se a expressão for muito longa, é melhor dividi-la em funções separadas ou talvez uma função com resultados intermediários nomeados. Se for curto, mas você não conseguir pensar em um bom nome, é melhor copiar a expressão, em vez de criar um nome terrível como condition1algo assim.


21

Em C # /. NET Little Wonders: Membros com Expressão em C # 6 :

Então, você deveria usar isso? Tudo se resume ao estilo. Minha intuição seria limitar isso a expressões e declarações simples que podem ser claramente entendidas à primeira vista.

(ênfase minha; veja a Atualização 1 abaixo)

Mais do Resumo do artigo acima:

Portanto, o C # 6 agora nos permite especificar os corpos de propriedades e métodos get-only com expressões. Isso pode ajudar a reduzir a carga de sintaxe de métodos muito simples para tornar seu código mais conciso.

No entanto, com todas as coisas, use seu julgamento para determinar se ele se encaixa em qualquer situação. Quando uma expressão é muito longa ou complexa, o uso da sintaxe de corpo inteiro ainda pode ser mais legível.

E outra citação sobre desempenho, porque os problemas de desempenho também podem ser usados ​​quando é apropriado usar um determinado recurso de idioma:

Agora, você pode perguntar: isso tem implicações no desempenho em tempo de execução? Na verdade, a resposta é não . Isso é simplesmente açúcar sintático que se expande na mesma IL que escrever o corpo inteiro. Ele não cria um delegado, simplesmente empresta a sintaxe da expressão lambda para simplificar a criação de corpos simples que resultam em uma expressão.

(ênfase, autor)

Atualização 1: @ JörgWMittag disse

Isso não faz sentido. "limita isso a expressões e declarações simples"? Hã? Nem funciona com declarações, apenas com expressões!

Parece que o autor original pode ter um erro de ortografia. Para esclarecer, a partir do C # 6.0 novo e aprimorado :

Funções corporais de expressão são outra simplificação de sintaxe no C # 6.0. Essas são funções sem corpo de instrução. Em vez disso, você os implementa com uma expressão após a declaração da função.

Para ser claro, isso não torna um método ou propriedade uma expressão . Ele utiliza a sintaxe Expressão para reduzir as linhas de código (e o número de chaves).

Minha recomendação original ainda permanece: Use-a quando tornar seu código óbvio e fácil de entender, não simplesmente porque você pode usá-lo.


2
Isso não faz sentido. "limitar isso a expressões e declarações simples "? Hã? Nem funciona com declarações, apenas com expressões! Também não estou convencido de que adicionar desordem (dois parênteses e uma returnpalavra - chave) possa levar a mais legibilidade. Afinal, a expressão complexa ainda é exatamente a mesma expressão complexa, apenas enterrada na desordem sintática.
Jörg W Mittag

3
Pelo que li, os membros corporais da expressão não são realmente expressões. Eles são açúcar sintático. A menos que a especificação do C # tenha sido alterada desde a publicação no blog, ela suporta métodos com tipos de retorno nulos.
Greg Burghardt

1
Eu posso estar errado, mas acredito que os efeitos colaterais não são permitidos nas declarações de expressão. Então, para mim, o benefício das declarações de expressão é que você está dizendo ao leitor que essa "expressão" é pura e que não há efeitos colaterais ocultos que você, leitor, precisa procurar.
John

1
@John "não permitido" está completamente errado. Você pode fazer todas as travessuras, como criar uma ação, dentro da declaração de ações, definir variáveis ​​de membro e depois invocar a ação. Portanto, obviamente, os efeitos colaterais não são permitidos. Definitivamente, eu os desencorajaria, pois eles não entendem a sintaxe da expressão.
Mafii 26/05

@Mafii. Obrigado. Desde então, aprendi que você pode fazer "declarações de expressão", que foram descritas como "modernas". Para mim, no entanto, a própria idéia é apenas confusa.
John
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.