2011-04-09 20 views
17

que tienen principalmente un fondo ++ C y estoy aprendiendo C#. Entonces, necesito ayuda con los modismos y el estilo de C#.¿Definir enumeraciones dentro de un método en C#?

Estoy tratando de escribir, en C#, un pequeño archivo de texto método de análisis en el que necesito una variable de estado simple con tres estados. En C++ los anunciara un enum así por la variable de estado:

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

... y luego usarlo en mi análisis de bucle de esta manera:

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

en C# Me di cuenta de que no es posible declarar enum dentro de un método. Entonces, ¿qué se supone que debo hacer por el estilo limpio? Declare este interno enum fuera del método? Usa números mágicos 1,2,3? Crear una clase separada para esto?

Por favor me ayuda a despejar mi confusión.

+0

Tal vez me falta algo, pero lo que es el punto de una enumeración si se usa en un solo método? – Doggett

+4

@Dogget - dar nombres legibles a los estados. De lo contrario, tendría que escribir if (estado == 2 && input == ".endheader") state = 1; – danatel

+2

Autoanotación de estado, etc. Es una práctica muy común en C, es decir, en el ejemplo dado: tener el estado como algo más significativo que un int. final lo hará con menos frecuencia en C# Tengo que decir - en primer lugar, ya que tienden a romper los métodos en componentes más pequeños, objetos, etc, en lugar de C, que es mucho más orientado imprescindible. O C++ cuando se usa de forma similar a C para ese asunto. – Mania

Respuesta

25

Lo más cerca que se puede obtener es una enumeración anidada privada con la clase:

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

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

Esto se pervierte porque los estados no tienen ningún significado fuera del método. Es como declarar variables de bucle fuera del método. Además, ¡debes darle un nombre! – danatel

+10

Bienvenido al mundo de los lenguajes empresariales conservadores. Podría ser peor, podría ser java: D –

+1

@danatel: No hago las reglas :) –

6

También puede utilizar las variables constantes, pero yo prefiero y creo que es mejor estilo de código para utilizar enumeraciones

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

También estoy a favor del enfoque Enum. Además, aunque ese no es el caso aquí, tiene ventajas sobre CONSTS cuando quiere combinarlos como banderas, ya que tiene un método para probarlo fácilmente.

Cuestiones relacionadas