A volte è necessario provare / catturare le eccezioni all'interno della condizione "se", ma non il corpo che segue. In C #, questo è davvero piuttosto ingombrante, richiedendo a gente del posto e codice che non è del tutto ovvio, a colpo d'occhio, quanto al suo funzionamento.
A volte è anche necessario scrivere istruzioni "switch", che, a differenza di "if", hanno più di due possibili risultati, anche se in C # richiede l'uso di un discretamente impopolare sintassi.
Ecco un'idea per combinarli.
Unione di switch
con try/catch
Per prima cosa, cambiamo la sintassi fondamentale di "switch" per essere vicini a sostituzione abbastanza popolare , ma senza i ricci extra:
switch (condition)
case 1 { }
case 2 { }
default { }
Successivamente, rendiamo possibile rilevare le eccezioni nella condizione. Sotto il cofano, questo inserisce un blocco try / catch appropriato solo quando è presente almeno un catch
:
switch (condition)
catch FileNotFoundException e { } // use "e"
catch ArgumentException { }
catch { }
case 1 { }
case 2 { }
default { }
Ora rendiamo più facile incatenare diverse affermazioni simili a quelle di if / else, spostando "predefinito" di un livello in alto e rinominandolo in "else":
switch (condition1)
catch FileNotFoundException { }
case 1 { }
case 2 { }
else switch (condition2)
case "abc" { }
case "def" { }
else
{ }
E quindi abbiamo un switch
unito a try/catch
!
Combinazione con "if"
Sia switch
che if
ora hanno clausole else
, quindi perché non ti permettono di mescolarli a tuo piacimento:
if (bool-condition1)
{ }
else if (bool-condition2)
{ }
else switch (string-expr)
catch FileNotFoundException { }
case "thing" { }
else
{ }
(grazie ach_l !)
Ulteriori miglioramenti
Attivare un elenco o un intervallo di valori è stato proposto e può essere facilmente incorporato:
switch (int-expression)
case 1 { }
case 2, 5 { }
case 10..50 { }
else switch (string-expression)
case "abc" { }
case "def" { }
else if (boolean-condition3)
{ }
else
{ }
In questo caso potrebbe essere davvero comodo poter fare riferimento al valore nella clausola di condizione. Questo può essere facilmente incorporato consentendo a uno di dichiarare una singola variabile in questa clausola nello stesso modo in cui C #%% co_de consente:
switch (var z = int-expression)
case 2, 5 { return z == 2 ? "two" : "five"; }
case 10..50 { return (z * 10).ToString(); }
vantaggi
Tra gli altri vantaggi, uno può ora esprimere uno scenario di gestione degli errori comune in modo conciso, e tuttavia non WTFy :
switch (bool-condition)
catch FileNotFoundException e { }
case true { }
case false { }
Questo risolverebbe qualsiasi difficoltà di codifica nella vita reale che hai incontrato? Ci sono delle modifiche che potresti applicare a questo?