2009-03-05 11 views
67

Estaba leyendo en enumeraciones y las encuentro muy similares a declarar constantes. ¿Cómo sabría cuándo usar una constante en lugar de una enumeración o viceversa? ¿Cuáles son algunas de las ventajas de usar enums?Enumeraciones y constantes. ¿Qué usar cuando?

+0

ver también http://stackoverflow.com/questions/755685/c-static-readonly-vs-const –

+0

ver también http://stackoverflow.com/questions/11575376/why-use-enums-instead-of -constantes para una pregunta similar para Java (las respuestas se aplican principalmente a C# también). –

Respuesta

68

Use las enumeraciones cuando desee definir un rango de valores que algo puede ser. El color es un ejemplo obvio como:

public enum Colour 
{ 
    White, 
    Red, 
    Blue 
} 

O tal vez un conjunto de posibles cosas como: (Ejemplo que le robé a here como soy perezoso)

[FlagsAttribute] 
enum DistributedChannel 
{ 
    None = 0, 
    Transacted = 1, 
    Queued = 2, 
    Encrypted = 4, 
    Persisted = 16, 
    FaultTolerant = Transacted | Queued | Persisted 
} 

Constantes deben ser para un solo valor como PI No hay un rango de valores PI, solo hay PI.

+0

¿Qué sucede si termina usando '.ToString()' en la enumeración mucho, cualquier valor en el uso de una clase con cadenas const que se ve y actúa como una enumeración, pero elude una llamada a 'ToString()'? [Ejemplo] (https://hastebin.com/exehipiwut.cs) – Sinjai

+0

Espera, creo que respondí mi propia pregunta. El código en ese ejemplo no funcionaría: tendrías que tomar la entrada como una cadena, que realmente no se comportaría como una enumeración. – Sinjai

16

Una constante es una característica del lenguaje que dice que la variable no cambiará el valor (por lo que el compilador puede hacer optimizaciones en torno a ese conocimiento) donde una enumeración es un tipo específico.

Las constantes pueden ser cualquier tipo de datos, pero una enumeración es una enumeración.

Utilizo una enumeración en cualquier lugar donde podría tener una serie de opciones y desea mejorar la legibilidad del código. es decir, podría tener niveles de rastreo como un int con los valores 0, 1, 2 o como una enumeración como error, advertencia e información.

Enum también tienen la capacidad de ser utilizados como operadores bit a bit, es decir, FontStyle.Bold | FontStyle.Italic te daría fuentes en negrita y cursiva.

5

Además de la respuesta de Robert:

  1. Uso enumeración de un conjunto finito de valores con nombre. Realmente no le importa el valor numérico detrás de cada símbolo (pero aún tiene la capacidad de imponerlos, por ejemplo, para la compatibilidad con un sistema heredado).

  2. Robert: Sí, Enum's se puede utilizar como campos de bits. Use el atributo Flags (y asegúrese de que los miembros de la enumeración tengan valores numéricos adecuados).

3

Una constante C# es similar a una variable en que da un nombre definido a un valor. Sin embargo, una constante difiere de una variable estándar porque una vez definida, el valor asignado a la constante nunca se puede cambiar. El principal beneficio de las constantes es su asistencia en la creación de código de auto documentación y la declaración de valores clave en un solo lugar, lo que permite un mantenimiento sencillo si el valor necesita ser actualizado y el software recompilado.

Mientras que las listas de enumeradores son útiles para definir secuencias y estados, particularmente cuando hay una progresión natural a través de esos estados. Esto se debe a que cada constante en la lista se puede formatear y comparar usando su nombre o valor. Una enumeración también se puede usar para definir un conjunto limitado de valores válidos.

+0

"Enumerator lists"? –

22

Lo que falta en las otras respuestas es que las enumeraciones tienen un tipo de base entera. Puede cambiar el valor predeterminado de int a cualquier otro tipo integral, excepto carbón como:

enum LongEnum : long { 
    foo, 
    bar, 
} 

se puede convertir explícitamente desde y implícitamente al tipo de la base, que es útil en interruptores-declaraciones. Tenga en cuenta que se puede convertir cualquier valor del tipo de base en una enumeración, incluso si la enumeración no tiene ningún miembro con el valor apropiado.Entonces, usar siempre la sección predeterminada en un interruptor es una buena idea. Por cierto, .NET en sí mismo permite incluso enumeraciones de puntos flotantes, pero no puede definirlas en C#, aunque creo que todavía puede usarlas (excepto en el interruptor).

Además, el uso de enumeraciones le proporciona más seguridad. Si tiene la intención de usar, p. constantes int como parámetros de método, entonces podría llamar al método con cualquier valor int. Por supuesto, a través del casting también puede suceder con enumeraciones, pero no ocurrirá accidentalmente. Peor es la posibilidad de confundir el orden de los parámetros.

void method(int a, int b) {...} 

Si constante A solamente puede entrar en una constante y B sólo puede entrar en b, a continuación, utilizando dos tipos enum diferentes destapará cualquier mal uso durante la compilación.

Cuestiones relacionadas