Quando è appropriato usare membri con espressioni corporee? [chiuso]

22

C # 6 introduce membri con corpo di espressione, che consentono un 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, per decidere quale usare deve essere utilizzata una regola empirica. Quando è appropriata la nuova alternativa?

    
posta Asik 24.08.2015 - 18:46
fonte

2 risposte

12

I linguaggi di programmazione funzionale consistono solo di espressioni, quindi la maggior parte ha avuto una funzione come questa essenzialmente 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 sarebbe quello di 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 in una funzione con risultati intermedi con nome. Se è breve, ma non riesci a pensare ad un buon nome, è meglio copiare semplicemente l'espressione piuttosto che creare un nome terribile come condition1 o qualcosa di simile.

    
risposta data 25.08.2015 - 14:49
fonte
17

Da C # /. NET Piccole meraviglie: Expression-Bodied Members in C # 6 :

So, should you use this? It all comes down to style. My gut would be to limit this to simple expressions and statements that can clearly be understood at first glance.

(enfasi, mia; vedi Aggiornamento 1 di seguito)

Altro dal Riassunto dell'articolo sopra:

So C# 6 now gives us the ability to specify get-only property and method bodies with expressions. This can help reduce the syntax burden of very simple methods to make your code more concise.

However, with all things, use your judgment on whether it fits for any given situation. When an expression is very long or complex, using the full body syntax may still be more readable.

E un'altra citazione sulle prestazioni, in quanto i problemi di prestazioni possono essere utilizzati anche quando è opportuno utilizzare una determinata funzione linguistica:

Now, you may ask, does this have any performance implications at runtime? Actually, the answer is no. This is simply syntactical sugar that expands into the same IL as writing the full body. It does not create a delegate, it is simply borrowing the lambda expression syntax to simplify writing simple bodies that result in an expression.

(enfasi, l'autore)

Aggiornamento 1: @ JörgWMittag ha detto

This makes no sense. "limit this to simple expressions and statements"? Huh? It doesn' even work with statements, only with expressions!

Sembra che l'autore originale abbia un misspoke. Per chiarire, da C # 6.0 nuovo e migliorato :

Expression bodied functions are another syntax simplification in C# 6.0. These are functions with no statement body. Instead, you implement them with an expression following the function declaration.

Per essere chiari, questo non rende un metodo o proprietà un Espressione . Utilizza la sintassi di espressione per ridurre le linee di codice (e i numeri di parentesi graffe).

Il mio consiglio originale rimane valido: usalo quando rende il tuo codice ovvio e più comprensibile, non semplicemente perché puoi usarlo.

    
risposta data 24.08.2015 - 19:23
fonte

Leggi altre domande sui tag