Commutatore C#:caso che non rientri nella limitazione di altri casi
-
09-06-2019 - |
Domanda
Questa domanda è una specie di aggiunta a questa domanda
In C#, un caso switch non può passare ad altri casi, ciò causa un errore di compilazione.In questo caso sto semplicemente aggiungendo un numero al totale mensile per il mese selezionato e per ogni mese successivo.(semplice esempio, non vuole essere reale)
switch (month)
{
case 0:
add something to month totals
case 1:
add something to month totals
case 2:
add something to month totals
default:
break;
}
Esiste un'alternativa logica a questo in C# senza dover scrivere un sacco di istruzioni if?
if (month <= 0)
add something to month
if (month <= 1)
add something to month
if (month <= 2)
add something to month
.... etc
Soluzione
Spesso, quando vedi il rumore di un'enorme istruzione switch o di molte istruzioni if che potrebbero rientrare in più di un blocco, stai cercando di eliminare una progettazione errata.
E se invece implementassi il modello Specifica per vedere se qualcosa corrisponde e poi agisci di conseguenza?
foreach(MonthSpecification spec in this.MonthSpecifications)
{
if(spec.IsSatisfiedBy(month))
spec.Perform(month);
}
quindi puoi semplicemente aggiungere specifiche diverse che corrispondono a ciò che stai cercando di fare.
È difficile dire quale sia il tuo dominio, quindi il mio esempio potrebbe essere un po' forzato.
Altri suggerimenti
Nelle istruzioni switch C# è possibile ignorare i casi solo se non è presente alcuna istruzione per il caso che si desidera ignorare
switch(myVar)
{
case 1:
case 2: // Case 1 or 2 get here
break;
}
Tuttavia se vuoi fallire con un'affermazione devi usare il temuto GOTO
switch(myVar)
{
case 1: // Case 1 statement
goto case 2;
case 2: // Case 1 or 2 get here
break;
}
Stai aggiungendo costanti?Se è così, forse qualcosa del genere funzionerebbe (sintassi C):
const int addToTotals[] = {123, 456, ..., 789};
for(i=month;i<12;i++)
totals += addToTotals[i];
Puoi fare una cosa simile con puntatori a variabili o funzioni se hai bisogno di istruzioni più complesse rispetto all'aggiunta di costanti ai totali per ogni mese successivo.
-Adamo
C'è già una domanda che affronta questo argomento:
Limitazioni delle istruzioni switch C#: perché?
MODIFICARE:
Il mio scopo principale nel sottolinearlo, gentili bestie, è che due domande con nome quasi identico aggiungono confusione all'insieme delle domande.
Scrivi i casi degli interruttori in ordine inverso
case 2:
case 1:
case 0:
break;
default:
Spero che aiuti!