2010-01-07 4 views
1

Possible en double:
Switch statement fallthrough in C#?C#: Solution de contournement pour une déclaration de commutateur illégal?

Le code suivant est illégal en C# parce que le contrôle ne peut pas tomber à travers d'une étiquette de cas à l'autre. Cependant, ce comportement est parfaitement légal en C++. Alors, comment iriez-vous coder le même comportement en C#?

enum TotalWords 
{ 
    One = 1, 
    Two, 
    Three, 
    Four 
} 

public String SomeMethod(TotalWords totalWords) 
{  
    String phrase = ""; 

    switch (totalWords) 
    { 
     case TotalWords.Four: 
      phrase = "Fox" + phrase; 
     case TotalWords.Three: 
      phrase = "Brown" + phrase; 
     case TotalWords.Two: 
      phrase = "Quick" + phrase; 
     case TotalWords.One: 
      phrase = "The" + phrase; 
      break; 

     default: 
      break; 
    } 

    return phrase; 
} 
+0

Dupliquer de http://stackoverflow.com/questions/174155/ qui inclut une bonne réponse en utilisant "goto case". –

Répondre

4

Eric Lippert, qui travaille sur la langue, parle ici:
http://ericlippert.com/2009/08/13/four-switch-oddities/

Version courte: le plus facile solution est d'utiliser un goto:

switch (totalWords) 
{ 
    case TotalWords.Four: 
     phrase = "Fox" + phrase; 
     goto case TotalWords.Three; 
    case TotalWords.Three: 
     phrase = "Brown" + phrase; 
     goto case TotalWords.Two; 
    case TotalWords.Two: 
     phrase = "Quick" + phrase; 
     goto case TotalWords.One; 
    case TotalWords.One: 
     phrase = "The" + phrase; 
     break; 

    default: 
     break; 
} 

Je pense que la La raison en est que 9 fois sur 10 une pause manquante est un bug plutôt qu'intentionnelle. Vous obliger à utiliser break et une branche explicite vous évite d'écrire des bogues et indique clairement aux futurs responsables que les retombées sont intentionnelles.

+0

"Je pense que la logique ici est que 9 fois sur 10 une pause manquante est un bug plutôt que intentionnelle." - C'est exactement pourquoi ils n'auraient jamais dû l'exiger en premier lieu. –

+0

Donc vous pensez que switch ne devrait pas avoir besoin de 'break 'et juste le faire automatiquement aux limites de l'étiquette? C'est comme ça que VB le fait. –

0

Étant donné que c'est une énumération numérique, et que vous faites essentiellement la même opération dans tous les cas, vous pouvez ré-écrire comme une boucle:

String[] phrase_bits = new String[] { "The", "Quick", "Brown", "Fox" }; 

public String SomeMethod(TotalWords totalWords) 
{ 
    int x = (int) totalWords; 
    String phrase = "" 
    while (--x >= 0) { 
     phrase = phrase_bits[x] + phrase 
    } 
    return phrase 
} 

Ce n'est pas une réponse générique pour tous passer des déclarations, mais pour ce cas, c'est plutôt bien.

+0

Cela suppose que TotalWords est linéaire, ce qui est le cas dans ce cas, mais s'il s'agit d'un indicateur (1, 2, 4, 8), il échouerait. –

Questions connexes