In generale (considerando tutte le lingue e tutti i compilatori) un'istruzione switch PU CAN ALCUNI EFFETTI essere più efficiente di un'istruzione if / else, poiché è facile per un compilatore generare tabelle di salto da istruzioni switch. È possibile fare la stessa cosa per le istruzioni if / else, dati i vincoli appropriati, ma è molto più difficile.
Nel caso di C #, anche questo è vero, ma per altri motivi.
Con un gran numero di stringhe, si ha un notevole vantaggio in termini di prestazioni nell'uso di un'istruzione switch, poiché il compilatore utilizzerà una tabella hash per implementare il salto.
Con un numero limitato di stringhe, le prestazioni tra i due sono le stesse.
Questo perché in quel caso il compilatore C # non genera una tabella di salto. Invece genera MSIL che equivale a blocchi IF / ELSE.
Esiste un'istruzione MSIL "switch statement" che, quando viene eseguita il jitter, utilizzerà una tabella di salto per implementare un'istruzione switch. Funziona solo con tipi interi, tuttavia (questa domanda fa domande sulle stringhe).
Per un numero limitato di stringhe, è più efficiente per il compilatore generare blocchi IF / ELSE che utilizzare una tabella hash.
Quando l'ho notato inizialmente, ho ipotizzato che, poiché i blocchi IF / ELSE erano usati con un piccolo numero di stringhe, che il compilatore avesse fatto la stessa trasformazione per un gran numero di stringhe.
Questo era SBAGLIATO. "IMA" è stato così gentile da segnalarmelo (beh ... non era gentile, ma aveva ragione, e io avevo torto, che è la parte importante)
Ho anche formulato un'ipotesi sulla mancanza di un'istruzione "switch" in MSIL (ho pensato che se ci fosse un primitivo switch, perché non lo stavano usando con una tabella hash, quindi non ci dovrebbe essere un primitivo switch. ...). Questo è stato sia sbagliato, sia incredibilmente stupido da parte mia. Ancora una volta "IMA" me lo ha fatto notare.
Ho fatto gli aggiornamenti qui perché è il post più votato e la risposta accettata.
Tuttavia, l'ho reso Community Wiki perché immagino di non meritare il REP per aver sbagliato. Se ne hai la possibilità, per favore, vota il post di "ima".