Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Next Informatik Xperience

Informatique, technologie et développement
.: Blog d'un MSP :.

C# : Bien utiliser les switch

Pour avoir récemment eu la question voici un petit rappel quand à l'utilisation de switch en c#.

Tout d'abord il convient de rappeler le principe d'un switch. Un switch est un structure permettant de spécifier un comportement en fonction d'une variable donnée. Ainsi les deux codes suivant sont équivalent en comportement :

Fig. 1

switch(maVariable) { case 0: // Action à réaliser break; case 1: // Autre action à réaliser break default: // Action par defaut break; }

Fig. 2

if(maVariable == 0) { // Action à réaliser } else if(maVariable == 1) { // Autre action à réaliser } else { // Action par defaut }

Ces 2 exemples ont le même comportement. Néanmoins il est important de noter qu'une structure en switch (figure 1) est plus performant qu'une structure en if (figure 2). Ceci s'explique aisément par le fait que lors d'un structure en if chacune des condition (les unes à prés les autres bien entendu) doivent être évalué jusqu'à trouvé une correspondance. Le switch utilisant un label celà permet un accés plus rapide.


Contraintes pour maVariable :

  • maVariable doit être uniquement d'un type primitif (ex : string, int); Si vous avez besoin d'utiliser d'autre type (ex : float, double,...) vous devez utiliser une structure en if (comme figure 2).
  • Les label de case doivent être une expression constante (ex : 42, "toto"). Si vous voulez calculer les valeurs ou utiliser des variables vous devez utiliser une structure en if (comme figure 2)
  • Chaque label de case doit être unique.
  • Chaque case contenant du code ne doit pas passer au case suivant implicitement (voir plus bas)

Il est à noter qu'un switch peut utiliser un type nullable dés l'instant qu'il respecte les règles ci-dessus.

Fig. 3

int? maVariable = null switch(maVariable) { case null: Console.WriteLine("Aucune valeur"); break; default: Console.WriteLine(maVariable); break; }

Maintenant abordons le saut de case en case dans notre structure. Contrairement à d'autre langage le c# ne supporte pas le passage implicite d'un case à l'autre à moins que celui-ci soit vide. Concrètement ce code ne compilera pas :

Fig. 4

switch(maVariable) { case 0: Console.WriteLine(maVariable); case 1: Console.WriteLine("1"); }

Par contre celui-ci compilera correctement :

Fig. 5

switch(maVariable) { case 0: Console.WriteLine(maVariable); break; case 1: case 2: Console.WriteLine("1"); break; }

Mais alors comment obtenir le comportement souhaitez à la figure 4?

Tout simplement en spécifiant explicitement qu'il faut effectuer le saut par l'intermédiaire de l'instruction "goto".

Fig. 6

switch(maVariable) { case 0: Console.WriteLine(maVariable); goto case 1; case 1: Console.WriteLine("1"); goto default: default: Console.WriteLine("default"); break; }

Happy Coding!

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: jeudi 1 mai 2008 12:42 par wizad

Commentaires

Julien237 a dit :

Intéressant rappel, mais notons toutefois que si les deux premières figures sont identiques en comportement, elles diffèrent par leurs performances, le but d'un switch étant justement d'assigner un label à une valeur afin d'éviter des évaluations de conditions.

# mai 2, 2008 11:05

wizad a dit :

Tout à fait. Je rajouterais cette mention cet après midi.

# mai 2, 2008 11:22

FREMYCOMPANY a dit :

Petite note pour les utilisateurs de VB.NET

Switch(x) {} est chez nous Select Case x : End Select

Contrairement à Switch, Select Case accepte les types non-natifs. Dans ce cas, le comportement devient similaire au IF .. ElseIF .. End IF.

Notez que vous pouvez aussi utiliser les opérateurs <,<=,>= et >. (mais alors vous compiler en fait un IF, même si le type est natif).

Les opérateurs Is et IsNot ne sont pas autorisés (Is étant utilisé dans la syntaxe des opérateurs).

Break est toujours sous-entendu avant chaque ligne de Case. Impossible de faire appliquer une même action à deux Case (excepté avec un goto)

Select Case 3

....Case 3 ' Will be applied

........DoSomething()

....Case Is < 4 ' Will not be applied

........DoAnotherThing()

....Case Else ' Will not be applied too

........DoSomethingElse()

End Select

# mai 2, 2008 12:52

wizad a dit :

Merci pour cette précision VB ;)

# mai 2, 2008 13:36
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Silverlight] En attendant Silverlight 2 RTW par Blog Technique d'Audrey PETIT le il y a 5 heures et 24 minutes

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le 10-11-2008, 01:18

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le 10-10-2008, 17:52

- Hello CS par Le Blog de julz le 10-10-2008, 12:26

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52