2011-02-10 7 views

risposta

4

Vi sono vantaggi?

Maintainability. Supponiamo che questi valori interi siano persistenti in un database. Non si desidera aggiungere un nuovo valore all'enumerazione in futuro e modificare i valori perché si inserisce un valore in un modo che sposta i valori non specificati.

Chiarezza. Explicitness è una buona cosa. Diciamo ancora che stiamo leggendo numeri interi da un database da qualche applicazione legacy. Quindi i codici hanno già un significato specifico e vogliamo esplicitamente allinearli.Potremmo dire

public enum EmployeeRole { 
    None, 
    Manager, 
    Admin, 
    Operator 
} 

e forse che allinea esattamente con le specifiche legacy o potremmo dire

public enum EmployeeRole { 
    None = 0, 
    Manager = 1, 
    Admin = 2, 
    Operator = 3 
} 

ed ora è più facile da leggere se non siamo in fila con la specifica eredità.

+0

E presumo che sia normale non archiviare il valore stringa dell'enumerazione, ma un numero intero associato? Di solito stavo solo memorizzando il valore della stringa. È solo una cattiva pratica perché spreca byte? – Joe

+0

Questa è ovviamente la risposta corretta alla domanda, ma vorrei solo aggiungere che non penso davvero che memorizzare i valori di enum nel database sia una buona idea. Vedi: http://wtfperminute.blogspot.com/2011/02/lookups-part-1-program-against.html –

+0

E sto assumendo che sia normale non archiviare il valore di stringa dell'enumerazione, ma piuttosto un associato numero intero? Di solito stavo solo memorizzando il valore della stringa. È solo una cattiva pratica perché spreca byte? - – Joe

0

aiuta evitare di avere questi valori presumibilmente costanti cambiano solo perché qualcuno riorganizza la classe. Diciamo che avete un nuovo dipendente che decide "Nessuno" dovrebbe andare in fondo alla lista:

public enum EmployeeRole 
{ 
    Manager, 
    Admin, 
    Operator, 
    None 
} 

Beh, se si fosse sempre e solo accedendo questi valori direttamente da EmployeeRole.Whatever, che non è un affare enorme. Ma la maggior parte delle enumerazioni che ho visto vengono convertite a un certo punto in un valore intero quando sono persistenti in un database. Ciò significa che tutti i tuoi elementi "None" nella memoria sono appena stati convertiti in "Manager".

Lo stesso problema si porrebbe se qualcuno semplicemente inserito un nuovo EmployeeRole tra, diciamo, Amministratore e Operatore.

Un altro vantaggio sorge quando non si considera che ci sia un valore appropriato "default" per la vostra enum. Ad esempio, se qualcuno ha dimenticato di mappare un campo EmployeeRole nell'ORM, gli oggetti estratti dal repository sembrano sempre avere il ruolo None (0 è sempre l'impostazione predefinita per le enumerazioni). A seconda del modo in cui il tuo software gestisce None, questo tipo di errore potrebbe non funzionare per un po 'di tempo. Ma se si fa questo:

public enum EmployeeRole 
{ 
    Manager = 1, 
    Admin = 2, 
    Operator = 3 
} 

... e poi combinarlo con fail-fast tecniche, si può prendere rapidamente gli errori in cui è stato previsto un "0" valore non valido:

public RightsManager GetByEmployeeRole(EmployeeRole role) 
{ 
    Require.That(role.IsDefined()); // throws an exception if role is not defined. 
    // find the rights manager for this role. 
} 
+1

E inoltre, "Nessuno" dovrebbe quasi sempre essere zero, in modo che i campi di tipo enum vengano inizializzati su un valore predefinito. –

+0

@Eric Lippert: Sì, supponendo di avere un valore predefinito accettabile. (vedere la mia modifica) – StriplingWarrior

1

E 'explicit definisce un valore piuttosto che lasciare che il compilatore lo gestisca in fase di compilazione. Nel caso che hai fornito, non serve a niente altro che essere leggibile e ben definito. Non fa male nulla e si traduce nello stesso MISL che non li imposta esplicitamente. Tuttavia, nei casi in cui le enumerazioni si riferiscono a valori specifici che non sono auto-incrementati come nel caso precedente, questo tipo di definizione esplicita è molto utile.

public enum MyEnum 
{ 

    First = 1, 
    Second = 2, 
    Eleventh = 11 

} 
2

È utile quando si ha un contratto altrove. Se si memorizza l'enum in un database, si desidera digitare i numeri esplicitamente per assicurarsi di non rinumerare accidentalmente l'enumerazione inserendo un nuovo elemento nel mezzo.

0

Ad esempio, quando si memorizzano i valori in un database, è consigliabile disporre di una mappatura fissa tra numeri e valori simbolici. Se non si specificano esplicitamente i valori numerici, il compilatore li numererà in modo sequenziale, quindi se si inserisce uno nuovo, si avrà una mancata corrispondenza.

0

vedo due vantaggi principali:

  • Dare un valore che viene realated a qualcos'altro (come un valore del database, un intervallo, ecc). Si noti che non è necessario fornire valori ordinati. Potrebbe essere 1, 23, 2 e 4, per esempio.
  • È molto più leggibile quando sono necessari i valori numerici.