2011-04-09 3 views
17

J'ai principalement un arrière-plan C++ et j'apprends le C#. Donc, j'ai besoin d'aide avec les idiomes C# et le style. J'essaye d'écrire, en C#, une petite méthode d'analyse de fichier texte dans laquelle j'ai besoin d'une simple variable d'état avec trois états. En C++ je déclarerais un enum comme celui-ci pour la variable d'état:Définir enums dans une méthode en C#?

enum { stHeader, stBody, stFooter} state = stBody; 

... et puis l'utiliser dans ma boucle d'analyse syntaxique comme ceci:

if (state == stHeader && input == ".endheader") 
{ 
    state = stBody; 
} 

en C# Je me rends compte que ce n'est pas possible de déclarer un enum à l'intérieur d'une méthode. Alors, qu'est-ce que je suis censé faire pour le style propre? Déclarer cette enum interne en dehors de la méthode? Utilisez les nombres magiques 1,2,3? Créer une classe séparée pour cela?

Aidez-moi à clarifier ma confusion.

+0

Peut-être qu'il me manque quelque chose, mais quel est le but d'une énumération si elle est utilisée dans une seule méthode seulement? – Doggett

+4

@Dogget - donne des noms lisibles aux états. Sinon, je devrais écrire if (state == 2 && input == ".endheader") state = 1; – danatel

+2

Auto-annotation de l'état etc. C'est une pratique très courante en C, c'est-à-dire dans l'exemple donné - avoir l'état comme quelque chose de plus significatif qu'un int. Cela revient moins souvent en C# Je dois dire - principalement parce que vous avez tendance à décomposer les méthodes en composants plus petits, en objets, etc., plutôt qu'en C, qui est beaucoup plus impératif. Ou C++ quand il est utilisé similaire à C d'ailleurs. – Mania

Répondre

25

Le plus proche, vous pouvez obtenir est un ENUM imbriqué privé avec la classe:

public class TheClass 
{ 
    private enum TheEnum 
    { 
     stHeader, 
     stBody, 
     stFooter 
    } 

    // ...the rest of the methods properties etc... 
} 
+10

Ceci est perverti parce que les états n'ont absolument aucun sens en dehors de la méthode. C'est comme déclarer des variables de boucle en dehors de la méthode. De plus, vous devez lui donner un nom! – danatel

+10

Bienvenue dans le monde des langues d'entreprise conservatrices. Cela pourrait être pire cependant, ça pourrait être java: D –

+1

@danatel: Je ne fais pas les règles :) –

6

Vous pouvez également utiliser les variables constantes mais je préfère et je pense est meilleur style de code à utiliser énumérations

public class Class1 
{ 
    private enum TheEnum 
    { 
     stHeader, 
     stBody, 
     stFooter 
    } 
    public void SomeMethodEnum() 
    { 
     TheEnum state = TheEnum.stBody; 
     switch (state) 
     { 
      case TheEnum.stHeader: 
       //do something 
       break; 
      case TheEnum.stBody: 
       break; 
      case TheEnum.stFooter: 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 


    public void SomeMethodConst() 
    { 
     int state = 1; 
     const int Header = 1; 
     const int Body = 2; 
     const int Footer = 3; 

     switch (state) 
     { 
      case Header: 
       break; 
      case Body: 
       break; 
      case Footer: 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 

    } 
} 
0

Je préférerais aussi l'approche Enum. De plus, bien que ce ne soit pas le cas ici, il a des avantages sur les CONSTS quand vous voulez les combiner comme des drapeaux, puisque vous avez une méthode pour tester facilement cela.