En général (compte tenu de tous les langages et de tous les compilateurs), une instruction switch PEUT PARFOIS être plus efficace qu'une instruction if / else, car il est facile pour un compilateur de générer des tables de saut à partir d'instructions switch. Il est possible de faire la même chose pour les instructions if / else, étant donné les contraintes appropriées, mais c'est beaucoup plus difficile.
Dans le cas de C #, cela est également vrai, mais pour d'autres raisons.
Avec un grand nombre de chaînes, l'utilisation d'une instruction switch présente un avantage significatif en termes de performances, car le compilateur utilise une table de hachage pour implémenter le saut.
Avec un petit nombre de cordes, les performances entre les deux sont les mêmes.
En effet, dans ce cas, le compilateur C # ne génère pas de table de saut. Au lieu de cela, il génère MSIL qui est équivalent aux blocs IF / ELSE.
Il existe une instruction MSIL "instruction de commutation" qui, lorsqu'elle est jitted, utilisera une table de saut pour implémenter une instruction de commutation. Cependant, cela ne fonctionne qu'avec des types entiers (cette question concerne les chaînes).
Pour un petit nombre de chaînes, il est plus efficace pour le compilateur de générer des blocs IF / ELSE que d'utiliser une table de hachage.
Lorsque j'ai remarqué cela à l'origine, j'ai fait l'hypothèse que, comme les blocs IF / ELSE étaient utilisés avec un petit nombre de chaînes, le compilateur faisait la même transformation pour un grand nombre de chaînes.
C'était faux. 'IMA' a eu la gentillesse de me le signaler (enfin ... il n'était pas gentil à ce sujet, mais il avait raison, et j'avais tort, ce qui est important)
J'ai également fait une supposition à propos de l'absence d'une instruction "switch" dans MSIL (je me suis dit, s'il y avait une primitive switch, pourquoi ne l'utilisaient-ils pas avec une table de hachage, donc il ne devait pas y avoir de primitive switch. ...). C'était à la fois faux et incroyablement stupide de ma part. Encore une fois, «IMA» me l'a fait remarquer.
J'ai fait les mises à jour ici parce que c'est le post le mieux noté et la réponse acceptée.
Cependant, je l'ai fait Community Wiki parce que je pense que je ne mérite pas le REP pour avoir tort. Si vous en avez l'occasion, veuillez voter pour le poste de 'ima'.