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.
}
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
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 –
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