In teoria è possibile utilizzare int64 come tipo di base nell'enumerazione e ottenere 2^63 voci possibili. Altri ti hanno dato risposte eccellenti su questo.
Penso che ci sia una seconda domanda implicita di se si utilizza un enum per qualcosa con un numero enorme di elementi. Questo in realtà si applica direttamente al tuo progetto in molti modi.
Una delle maggiori considerazioni sarebbe la manutenibilità a lungo termine. Pensi che la compagnia cambierà mai la lista dei valori che stai usando? In tal caso, sarà necessario essere retrocompatibili con le liste precedenti? Quanto può essere significativo questo problema? In generale, più grande è il numero di membri in un enum correlato a una probabilità più alta che l'elenco dovrà essere modificato in una data futura.
Le enumerazioni sono ottime per molte cose. Sono puliti, veloci e semplici da implementare. Funzionano perfettamente con IntelliSense e semplificano il lavoro del programmatore successivo, soprattutto se i nomi sono chiari, concisi e se necessario ben documentati.
Il problema è un'enumerazione che presenta anche degli svantaggi. Possono essere problematici se hanno bisogno di essere modificati, specialmente se le classi che li utilizzano vengono mantenute in memoria.
Nella maggior parte dei casi le enumerazioni vengono conservate come valori sottostanti, non come i loro nomi descrittivi.
enum InsuranceClass
{
Home, //value = 0 (int32)
Vehicle, //value = 1 (int32)
Life, //value = 2 (int32)
Health //value = 3 (int32)
}
In questo esempio il valore InsuranceClass.Life
otterrebbe persistito come numero 2.
Se un altro programmatore fa una piccola modifica al sistema e aggiunge Pet al enum come questo;
enum InsuranceClass
{
Home, //value = 0 (int32)
Vehicle, //value = 1 (int32)
Pet, //value = 2 (int32)
Life, //value = 3 (int32)
Health //value = 4 (int32)
}
Tutti i dati che escono dal stoccaggio sarà ora mostrare la Vita politiche come Pet politiche. Questo è un errore estremamente facile da fare e può introdurre bug difficili da rintracciare.
Il secondo problema principale con l'enumerazione è che ogni modifica dei dati richiederà la ricostruzione e la ridistribuzione del programma. Questo può causare diversi gradi di dolore. Su un server web che potrebbe non essere un grosso problema, ma se si tratta di un'app utilizzata su 5000 sistemi desktop, si ha un costo completamente diverso per ridistribuire la modifica dell'elenco secondario.
Se è probabile che l'elenco cambi periodicamente, è consigliabile prendere in considerazione un sistema che memorizza tale elenco in qualche altra forma, molto probabilmente al di fuori del codice. I database sono stati progettati appositamente per questo scenario o potrebbe essere utilizzato anche un semplice file di configurazione (non la soluzione preffered). Una pianificazione intelligente delle modifiche può ridurre o evitare i problemi associati alla ricostruzione e alla ridistribuzione del software.
Questo non è un suggerimento per ottimizzare prematuramente il sistema per la possibilità di cambiamento, ma più un suggerimento per strutturare il codice in modo che un probabile cambiamento in futuro non crei un problema grave. Situazioni diverse richiedono decisioni divergenti.
Ecco le mie rozze regole empiriche per l'uso di enumerazioni;
- Utilizzarli per classificare e definire altri dati, ma non come dati . Per essere più chiaro, utilizzare
InsuranceClass.Life
su per determinare come devono essere utilizzati gli altri dati di una classe, ma non aggiungerei al valore sottostante di {pseudocode} InsuranceClass.Life = $653.00
e utilizzando il valore stesso nei calcoli. Le enumerazioni non sono costanti. Fare crea confusione.
- Utilizzare le enumerazioni quando è improbabile che l'elenco enum cambi. Le enumerazioni sono fantastiche per concetti fondamentali ma scarse per idee in continua evoluzione. Quando si crea un'enumerazione, questo è un contratto con i futuri programmatori che si desidera evitare.
- Se si deve modificare un enum, quindi avere una regola che ognuno segue che si aggiunge alla fine, non al centro. L'alternativa è che tu sia definire valori specifici per ogni enumerazione e non cambiarli mai. Il punto è che è improbabile sapere come altri utenti stanno usando le proprie enumerazioni di valori di e modificandole può causare sofferenza a chiunque altro utilizzando il proprio codice. Questo è un ordine di grandezza più importante per qualsiasi sistema che persiste i dati.
- Il corollario di # 2 e # 3 è di non eliminare mai un membro di un enum. Ci sono specifici cerchi infernali per i programmatori che fanno questo in un codebase usato da altri.
Speriamo di aver ampliato le risposte in modo utile.
Sono solo curioso di sapere cosa stai facendo che avrebbe bisogno di così tante costanti per dover fare questa domanda ... – NotDan
Beh, certo che non userò il limite di dimensione 2^32, ma ho bisogno di un sacco di "storage" . Stiamo sviluppando un'applicazione correlata all'assicurazione, quindi ci sono un sacco di variabili che devono essere presenti per poter ottenere il punteggio per ottenere un premio e come potete immaginare sono molto (probabilmente 600 a 1.000) –