2012-05-15 23 views
6

Ho un gruppo di valori che rappresentano uno stato (ON, OFF, READY, ...). Questi valori vengono anche memorizzati in un DB come un campo int, quindi mi chiedo se le best practice potrebbero dire di rendere questo un enum o solo un gruppo di tipi const int su una classe.C# Enum o costanti int

Enum sembra un adattamento naturale per la lettura/codifica umana, ma sembra che nasconda il fatto che è importante quale valore inte- grale i valori vengono mappati (oppure i valori recuperati da un DB verranno istanziati allo stato errato). Qualcuno potrebbe entrare più tardi e aggiungere un nuovo valore all'enum o qualcosa del genere e buttare via tutto.

Qual è l'approccio migliore?

+1

È vero anche per gli interi! Puoi impostare il valore che vuoi per ogni enum e il compilatore applicherà (un po ') il tuo codice. Almeno non sarai in grado di scrivere: myVar.MyEnum = 12345; –

+1

Vorrei andare "enum" per il tuo esempio. Pi è una costante, così come la velocità della luce. Il tuo insieme di stati non sono, a mio modesto parere. – Ste

risposta

10

Penso che enum sia ancora la scelta migliore per la leggibilità. Tuttavia, dal momento che i suoi valori vengono memorizzati nel DB, è necessario specificare i valori in modo esplicito:

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

+1 @OxedFrederik non semplicemente ** dichiara ** un enum ma nel tuo modello ** verifica ** è valido. Puoi lanciare qualsiasi numero intero a un enum. Personalmente ho adorato la soluzione postata da Kevin. –

0

è possibile determinare i valori in Enum te troppo, vale a dire:

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

Come viene qualcuno aggiunge un nuovo enum valore diverso da una nuova costante int?

Ricordare, è possibile impostare un enum su un valore intero specifico.

Leggere meglio leggibilità!

Come bonus aggiuntivo, è ora possibile utilizzare la tipizzazione forte per evitare imbrogli come

Widget.state = 474; 

Dove 474 non corrisponde a uno stato nel database.

+0

Questo è vero, ma l'area più volatile per questo tipo di cose è ai limiti dell'applicazione dove avviene la serializzazione. Questo significa che si finisce con istruzioni come 'Widget.state = (StateEnum) stateId' e C# fa ** not ** attenzione se' stateId' è un valore valido in 'StateEnum' e ** non ** genererà un'eccezione se 'stateId' è 474. – Nick

+0

@Nick yes, disinfetti i tuoi input. [Esistono anche metodi enum per aiutarti a farlo.] (Https://msdn.microsoft.com/en-us/library/system.enum.isdefined.aspx) – MushinNoShin

1

Vorrei andare con un enum e assicurarsi che sia molto ben documentato a quale tabella corrisponde l'enum.

Il pericolo con un sacco di costanti è che il tipo non fornisce alcuna indicazione su quali siano i valori validi e qualcuno potrebbe facilmente assegnare qualsiasi vecchio valore. Un utente malintenzionato del codice potrebbe ancora farlo con un cast, ma non si può fermare alcune persone da se stesse sparando nella loro piedi ...

0

direi Enums. Ti danno la possibilità di un formato macchina in un formato leggibile dall'uomo. Assicurati di documentarlo molto bene in questo modo

///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 
}; 

Non è necessario assegnare valore a ciascun membro. Inizia da 0 e il resto verrà incrementato automaticamente.

Dal momento che l'enum è di circa on/off, è possibile utilizzare utilizzare in modo booleano. 0 sta per False o Off e 1 su true o on.

è anche possibile convertire la vostra enum a int come

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

Salva valore nel database come int. e durante il recupero si può fare in questo modo

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

Se i valori saranno raramente mai cambiare, o se hai problemi con l'editing e ricompilare il codice, quindi utilizzare assicurarsi un enum con dichiarazione esplicita dei valori interi per ogni .Altrimenti creerei un object wrapper che estrae i valori dal database (puoi sempre memorizzare i valori per un po 'se sei preoccupato per le prestazioni). Quindi fai tutti i tuoi confronti con quel wrapper di oggetti. A meno che non si possa assicurare che i valori nel database non cambino senza che il codice che si sta aggiornando utilizzando un enum nel proprio codice sia solo volatile e rischioso. Se sei davvero avventuroso e vuoi entrare in codice, puoi fare cose interessanti.