Molti tipi di membri di struct e class (i campi sono l'eccezione principale) possono usare la sintassi dei membri con corpo di espressione. Definire un membro con un'espressione produce spesso codice più conciso e leggibile rispetto ai tradizionali blocchi e istruzioni.
I metodi e le proprietà di sola lettura sono tra i membri che si possono definire con un corpo di espressione.
public int Times3(int input) => input * 3;
public int Interesting => 1729;
Un'espressione switch può far corrispondere un valore a uno dei casi di un insieme di pattern e restituire il valore associato o eseguire l'azione associata. L'associazione è indicata dal simbolo =>. Inoltre, ogni pattern può avere una guardia del caso opzionale, introdotta dalla parola chiave when. L'espressione della guardia del caso deve valere true perché quel «braccio» dello switch venga selezionato. I casi (detti anche bracci dello switch) vengono valutati nell'ordine in cui sono scritti e, non appena si trova una corrispondenza, il processo si interrompe e viene restituito il valore associato.
double xx = 42d;
string interesting = xx switch
{
0 => "I suppose zero is interesting",
3.14 when DateTime.Now.Day == 14 && DateTime.Now.Month == 3 => "Mmm pie!",
3.14 => "π",
42 => "a bit of a cliché",
1729 => "only if you are a pure mathematician",
_ => "not interesting"
};
// => interesting == "a bit of a cliché"
Gli operatori ternari permettono di definire condizioni if all'interno di espressioni invece che in blocchi di istruzioni. Questo richiama gli approcci della programmazione funzionale e spesso rende il codice più espressivo e meno soggetto a errori.
L'operatore ternario combina 3 espressioni: una condizione, seguita da un'espressione da valutare e restituire se la condizione è vera (la parte if, introdotta da ?) e da un'espressione da valutare e restituire se la condizione è falsa (la parte else, introdotta da :).
int a = 3, b = 4;
int max = a > b ? a : b;
// => 4
Le espressioni throw sono un'alternativa alle istruzioni throw e in particolare possono accrescere la potenza delle espressioni ternarie e di altre espressioni composte.
string trimmed = str == null ? throw new ArgumentException() : str.Trim();
Ti è stato chiesto di migliorare del codice legacy relativo a una stazione meteorologica.
La stazione meteorologica accetta letture e produce alcuni indicatori, come temperatura e pressione.
Riorganizza i metodi appropriati della classe WeatherStation utilizzando i membri con corpo di espressione. Usa operazioni ternarie ed espressioni switch, dove opportuno, per migliorare l'espressività e ridurre potenzialmente gli errori.
Assicurati che tutti i test continuino a passare.
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.