C# : de la bonne utilisation des « 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 :

switch(maVariable)
{
    case 0:
        // Action à réaliser
        break;
    case 1:
        // Autre action à réaliser
        break;
    default:
        // Action par defaut
        break;
}
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.

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 :

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

Par contre celui-ci compilera correctement :

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 ».

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

Happy Coding!

[WPF] Un dataForm pour vos applications !

Pour tout ceux qui ont rêvé d’avoir le contrôle DataForm de silverlight dans leurs applications WPF, je me suis mis en tête cette semaine de le réaliser. C’est donc avec grand plaisir que je le partage avec vous via codeplex : http://wpfdataform.codeplex.com/
Bien entendu il s’agit d’une première version alors n’hésitez pas à me faire part de toute vos remarques et suggestions afin de l’améliorer.

Happy Coding!