2012-05-15 24 views
6

Tengo un grupo de valores que representan un estado (ON, OFF, READY, ...). Estos valores también se almacenan en un DB como un campo int, por lo que me pregunto si las mejores prácticas dirían que esto sea una enumeración o simplemente un grupo de tipos const int en una clase.C# Enum o constantes int

Enum parece una opción natural para la lectura/codificación humana, pero parece que oculta el hecho de que importa a qué enteros se asignen los valores (o los valores recuperados de un DB se instanciarán al estado incorrecto). Alguien puede entrar más tarde y agregar un nuevo valor a la enumeración o algo así y arrojar todo.

¿Cuál es el mejor enfoque?

+1

¡Es cierto también para los enteros! Puede establecer el valor que desea para cada enumeración y el compilador aplicará (un poco) su código. Al menos no podrá escribir: myVar.MyEnum = 12345; –

+1

I'd go 'enum' para su ejemplo. Pi es una constante, como lo es la velocidad de la luz. Tu conjunto de estados no lo son, en mi humilde opinión. – Ste

Respuesta

10

Creo que enum sigue siendo la mejor opción para la lectura. Sin embargo, ya que sus valores se almacenan en la base de datos, debe especificar los valores de forma explícita:

enum State { On = 1, Off = 2, Ready = 3}; 
+0

+1 @OxedFrederik no solo ** declara ** una enumeración, sino que en su modelo ** cheque ** es válida. Puedes convertir cualquier número entero en una enumeración. Personalmente, me encantó la solución publicada por Kevin. –

0

Usted puede determinar los valores de Enum usted demasiado, es decir:

enum STATE {ON=2, OFF=9, READY=14}; 
3

Cómo alguien adición de una nueva enumeración valorar cualquier diferente a una nueva constante int?

Recuerde, puede establecer una enumeración en un valor entero específico.

Embrace legibilidad!

Como un beneficio adicional, ahora se puede utilizar la tipificación estricta para evitar travesuras como

Widget.state = 474; 

Dónde 474 no corresponde a un estado en su base de datos.

+0

Esto es cierto, pero el área más volátil para este tipo de cosas se encuentra en los límites de las aplicaciones donde ocurre la serialización. Esto significa que terminas con sentencias como 'Widget.state = (StateEnum) stateId' y C# no ** cuida ** si' stateId' es un valor válido en 'StateEnum' y ** ** lanzará una excepción si 'stateId' es 474. – Nick

+0

@Nick yes, desinfecte sus entradas. [Hay incluso métodos enum para ayudar a hacer esto.] (Https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

Iría con una enumeración y me aseguraré de que esté muy bien documentada a qué tabla corresponde la enumeración.

El peligro con un grupo de fenómenos es que el tipo no transmite ninguna indicación de cuáles son los valores válidos y alguien podría asignar muy fácilmente cualquier valor anterior. Un usuario malintencionado de tu código aún podría hacer eso con un molde, pero no puedes evitar que algunas personas se peguen un tiro en sus propios pies ...

0

Yo diría Enums. Le dan la opción de un formato de máquina a un formato legible por humanos. Asegúrese de documentar muy bien de esta manera

///Summary 
/// About State Enum 
///Summary 
enum State : int 
{ 
    ///Summary 
    /// About Off Enum Value 
    ///Summary 
    Off = 0, 
    ///Summary 
    /// About On Enum Value 
    ///Summary 
    On, 
    ///Summary 
    /// About Ready Enum Value 
    ///Summary 
    Ready 
}; 

No hay necesidad de asignar un valor a cada uno de los miembros. Comience desde 0 y el resto se incrementará automáticamente.

Dado que su enumeración se trata de on/off, puede utilizarla de forma booleana. 0 significa Falso o apagado y 1 a verdadero o encendido.

También puede convertir su enumeración a int como

int value = (int)State.On; // value will have 1 

Guardar valor en la base de datos como int. y al recuperar se puede hacer como esto

State st = (State)int.Parse(mydatabasevalue); 
1

Si sus valores serán casi nunca cambia, o si tiene problemas con la edición y volver a compilar el código, a continuación, utilizar seguro de una enumeración con la declaración explícita de los valores enteros para cada .De lo contrario, crearía un contenedor de objetos que extraiga los valores de la base de datos (siempre podría almacenar en caché los valores de un bit si le preocupa el rendimiento). Luego haga todas sus comparaciones con ese contenedor de objetos. A menos que pueda asegurar que los valores en la base de datos no cambiarán sin que el código se actualice usando una enumeración en su código, es solo volátil y arriesgado. Si eres realmente aventurero y quieres entrar en la emisión de código, puedes hacer algunas cosas realmente geniales con eso.