Quando è appropriato usare membri con corpo di espressione? [chiuso]


24

C # 6 introduce membri con corpo di espressione, che consentono il codice semplificato in metodi e proprietà che restituiscono solo il risultato di un'espressione:

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

diventa:

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

Poiché ora abbiamo due sintassi esattamente equivalenti e valide, è necessario utilizzare alcune regole empiriche per decidere quale utilizzare. Quando è appropriata la nuova alternativa?


7
Umm, quando il corpo del membro è un'espressione?
Jörg W Mittag,

1
Ciò risponderebbe alla domanda "quando è possibile usare i membri con espressione corporea".
Asik,

7
Non completamente correlato, ma non puoi usarlo public override string ToString() => $"{_field1} {_field2}";?
Thaoden,

3
@JorgWMittag Aggiungerei "... che non ha effetti collaterali". Dichiarare un metodo in uno stile funzionale quando non è puramente funzionale sarebbe fuorviante.
Jules il

Risposte:


12

I linguaggi di programmazione funzionale consistono solo di espressioni, quindi la maggior parte ha avuto una caratteristica come questa fin dall'inizio. Lo usi quando hai un'espressione relativamente breve, spesso ripetuta frequentemente, che può essere sostituita da un nome ancora più breve, molto più significativo.

Un esempio comune sarebbero i predicati usati altrove, come:

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

Se l'espressione è troppo lunga, è meglio suddividerla in funzioni separate o forse una funzione con risultati intermedi denominati. Se è breve, ma non riesci a pensare a un buon nome, stai meglio semplicemente copiando l'espressione piuttosto che creare un nome terribile simile condition1o qualcosa del genere.


21

Da C # /. NET Little Wonders: Membri con espressione corporea in C # 6 :

Quindi, dovresti usare questo? Tutto si riduce allo stile. Il mio istinto sarebbe quello di limitare questo a semplici espressioni e dichiarazioni che possono essere chiaramente comprese a prima vista.

(enfasi, mia; vedi aggiornamento 1 di seguito)

Altro dal Sommario dell'articolo sopra:

Quindi C # 6 ora ci dà la possibilità di specificare corpi di proprietà e metodo get-only con espressioni. Questo può aiutare a ridurre l'onere della sintassi di metodi molto semplici per rendere il tuo codice più conciso.

Tuttavia, con tutte le cose, usa il tuo giudizio sull'adeguatezza per una determinata situazione. Quando un'espressione è molto lunga o complessa, l'uso della sintassi dell'intero corpo può essere ancora più leggibile.

E un'altra citazione sulle prestazioni, perché i problemi di prestazioni possono anche giocare quando è appropriato utilizzare una determinata funzionalità linguistica:

Ora, potresti chiederti, questo ha delle conseguenze sulle prestazioni in fase di esecuzione? In realtà, la risposta è no . Questo è semplicemente zucchero sintattico che si espande nello stesso IL della scrittura di tutto il corpo. Esso non crea un delegato, viene semplicemente prendendo in prestito la sintassi espressione lambda semplificare crei corpi semplici che risultano in un'espressione.

(enfasi, l'autore)

Aggiornamento 1: ha detto @ JörgWMittag

Questo non ha senso. "limitalo a espressioni e dichiarazioni semplici"? Eh? Non funziona nemmeno con le dichiarazioni, solo con le espressioni!

Sembra che l'autore originale potrebbe avere errori di battitura. Per chiarire, da The New and Improved C # 6.0 :

Le funzioni di espressione sono un'altra semplificazione della sintassi in C # 6.0. Queste sono funzioni senza corpo di istruzioni. Invece, li implementate con un'espressione che segue la dichiarazione di funzione.

Per essere chiari, questo non rende un metodo o una proprietà un'espressione . Utilizza la sintassi di espressione per ridurre le righe di codice (e il numero di parentesi graffe).

La mia raccomandazione originale rimane valida: usala quando rende il tuo codice ovvio e più facile da capire, non semplicemente perché puoi usarlo.


2
Questo non ha senso. "limitalo a espressioni e dichiarazioni semplici "? Eh? Non funziona nemmeno con le dichiarazioni, solo con le espressioni! Inoltre, non sono convinto che l' aggiunta di disordine (due parentesi e una returnparola chiave) possa mai portare a una maggiore leggibilità. Dopotutto, l'espressione complessa è ancora la stessa identica espressione complessa, sepolta nel disordine sintattico.
Jörg W Mittag,

3
Da quello che ho letto espressione i membri corposi non sono in realtà espressioni. Sono zucchero sintattico. A meno che la specifica C # non sia cambiata dal post del blog, supporta i metodi con tipi di ritorno nulli.
Greg Burghardt,

1
Potrei sbagliarmi, ma credo che gli effetti collaterali siano vietati nelle dichiarazioni di espressione. Quindi, per me, il vantaggio delle dichiarazioni di espressione è che stai dicendo al lettore che questa "espressione" è pura e che non ci sono effetti collaterali nascosti che tu, il lettore, devi cercare.
John,

1
@John "non consentito" è completamente sbagliato. Puoi fare tutti gli shenanigans come creare un'azione, all'interno della dichiarazione delle azioni impostare le variabili membro e quindi invocare l'azione. Pertanto, gli effetti collaterali non sono ovviamente vietati. Li scoraggerei sicuramente, anche se mancano il punto della sintassi dell'espressione.
Mafii,

@Mafii. Grazie. Da allora ho imparato che puoi fare "dichiarazioni di espressione", che sono state descritte come "moderne". Per me, tuttavia, l'idea stessa è solo confusa.
John,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.