155 votes

Déclaration de variable dans une instruction de commutation C#

Pourquoi, dans une instruction switch C#, pour une variable utilisée dans plusieurs cas, ne la déclare-t-on que dans le premier cas ?

Par exemple, l'erreur suivante se produit : "Une variable locale nommée 'variable' est déjà définie dans cette portée".

switch (Type)
{
    case Type.A:
            string variable = "x";
                break;
    case Type.B:
            string variable = "y";
                break;
}

Cependant, selon la logique, la déclaration initiale ne devrait pas être frappée si le type est Type.B . Toutes les variables d'une instruction de commutation existent-elles dans une seule portée, et sont-elles créées/affectées avant le traitement de toute logique ?

282voto

Michael Burr Points 181287

Si vous souhaitez qu'une variable s'applique à un cas particulier, il suffit d'enfermer le cas dans son propre bloc :

switch (Type)
{
    case Type.A:
    {
        string variable = "x";
        /* Do other stuff with variable */
    }
    break;

    case Type.B:
    {
        string variable = "y";
        /* Do other stuff with variable */
    }
    break;
}

51voto

Mitchel Sellers Points 38352

Je pense que cela a à voir avec la portée globale de la variable, c'est une portée au niveau du bloc qui est définie au niveau du commutateur.

Personnellement, si vous définissez une valeur à l'intérieur d'un commutateur dans votre exemple, pour que cela soit vraiment utile, vous devriez de toute façon le déclarer à l'extérieur du commutateur.

42voto

Jon Skeet Points 692016

Oui, la portée est le bloc de commutation entier - malheureusement, IMO. Vous pouvez toujours ajouter des accolades à l'intérieur d'un seul cas, cependant, pour créer une portée plus petite. Quant à savoir si elles sont créées/allouées - le cadre de pile a suffisamment d'espace pour toutes les variables locales d'une méthode (en laissant de côté les complexités des variables capturées). Ce n'est pas comme si cet espace était alloué pendant l'exécution de la méthode.

14voto

itsmatt Points 18905

Parce que leur champ d'action se situe au niveau du bloc d'interrupteurs. Vérifiez ici pour plus d'informations.

-2voto

James Curran Points 55356

L'initialisation a lieu dans le cas, mais la déclaration est effectivement faite au sommet de la portée. (Psuedo-code)

switch (Type)
{
string variable;

    case Type.A:
            variable = "x";
                break;
    case Type.B:
            variable = "y";
                break;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X