70 votes

C# instruction Switch avec/sans les accolades.... quelle est la différence?

A C# toujours permis d'omettre les accolades à l'intérieur d'un switch() déclaration entre l' case: des déclarations?

Quel est l'effet de l'omission, comme les programmeurs javascript souvent faire?

Exemple:

switch(x)
{
  case OneWay:
  {                               //  <---- Omit this entire line
    int y = 123;
    FindYou(ref y);
    break;
  }                               //  <---- Omit this entire line
  case TheOther:
  {                               //  <---- Omit this entire line
    double y = 456.7; // legal!
    GetchaGetcha(ref y);
    break;
  }                               //  <---- Omit this entire line
}

103voto

0xA3 Points 73439

Accolades ne sont pas nécessaires, mais ils peuvent venir dans maniable pour introduire une nouvelle déclaration de l'espace. Ce comportement n'a pas changé depuis C# 1.0 autant que je sache.

L'effet de l'omission est que toutes les variables déclarées quelque part à l'intérieur de l' switch de résultats sont visibles à partir de leur point de déclaration dans tous les cas branches.

Voir aussi Eric Lippert l'exemple (cas 3 dans le post):

Quatre commutateurs de bizarreries

Eric exemple:

switch(x)
{
  case OneWay:
    int y = 123;
    FindYou(ref y);
    break;
  case TheOther:
    double y = 456.7; // illegal!
    GetchaGetcha(ref y);
    break;
}

Cela ne veut pas compiler, car int y et double y sont dans la même déclaration de l'espace introduit par l' switch déclaration. Vous pouvez corriger l'erreur en séparant la déclaration des espaces en utilisant des accolades:

switch(x)
{
  case OneWay:
  {
    int y = 123;
    FindYou(ref y);
    break;
  }
  case TheOther:
  {
    double y = 456.7; // legal!
    GetchaGetcha(ref y);
    break;
  }
}

14voto

Brian R. Bondy Points 141769

Les accolades sont un élément facultatif du bloc de commutateurs, ils ne font pas partie de l'interrupteur sections. L'appareil peut être placé à l'intérieur de l'interrupteur sections ou également inséré n'importe où pour le contrôle de la portée dans votre code.

Ils peuvent être utiles pour limiter la portée dans le bloc de commutateurs. Par exemple:

int x = 5;

switch(x)
{
case 4:
    int y = 3;
    break;
case 5:
    y = 4;
    //...                      
    break;
}

vs...

int x = 5;

switch(x)
{
  case 4:
  {
    int y = 3;
    break;
  }
  case 5:
  {
    y = 4;//compiling error
    //...                      
    break;
  }
}

Remarque: en C# nécessite une valeur de y dans le cas 5 bloc dans le premier exemple avant de l'utiliser. C'est de la protection contre les chocs, les variables de suivre à travers.

9voto

Guffa Points 308133

Les accolades à l'intérieur du commutateur est en réalité pas partie de l'interrupteur de la structure. Ils sont juste à portée de blocs que vous pouvez appliquer dans le code où vous le souhaitez.

La différence entre avoir et ne pas en avoir, c'est que chaque bloc a son propre champ d'application. Vous pouvez déclarer des variables locales à l'intérieur de la portée, qui n'entre pas en conflit avec d'autres variables dans un autre champ.

Exemple:

int x = 42;
{
  int y = x;
}
{
  int y = x + 1; // legal, as it's in a separate scope
}

4voto

Henk Holterman Points 153608

Ils ne sont pas strictement nécessaires, mais dès que vous commencez à déclarer des variables locales (dans le commutateur branches) ils sont très recommandé.

Cela ne fonctionne pas:

    // does not compile
    switch (x)
    {
        case 1 :               
            int j = 1;
            ...
            break;

        case 3:
            int j = 3;   // error
            ...
            break;
    }

Cette compile mais c'est effrayant:

    switch (x)
    {
        case 1 :               
            int j = 1;
            ...
            break;

        case 3:
            j = 3;
            ...
            break;
    }

Donc, c'est mieux:

  switch (x)
    {
        case 1 : 
         {             
            int j = 1;
            ...
         }
         break;  // I prefer the break outside of the  { }

        case 3: 
         {
            int j = 3;
            ...
         }
         break;
    }

Il suffit de le garder simple et lisible. Vous ne voulez pas exiger lecteurs d'avoir une connaissance détaillée des règles impliqués dans le milieu exemple.

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