Abbreviazione di enumerazione, un enum tipo variabile può essere trovato in C (ANSI, non nell'originale K&R), C ++ e C #. L'idea è che invece di usare un int per rappresentare un insieme di valori, viene invece utilizzato un tipo con un insieme limitato di valori.
Ad esempio, se usiamo i colori dell'arcobaleno, che sono
- Rosso
- arancia
- Giallo
- verde
- Blu
- Indaco
- Viola
Se gli enum non esistessero, potresti usare a #definire (in C) o const in C ++ / C # per specificare questi valori. Per esempio
Troppi Ints da contare!
Il problema è che ce ne sono molti altri int dei colori. Se il viola ha il valore 7 e il programma assegna un valore di 15 a una variabile, quindi è chiaramente un bug ma potrebbe non essere rilevato poiché 15 è un valore valido per un int.
Enums to the Rescue
Un enum è un tipo definito dall'utente costituito da un insieme di costanti denominate chiamate enumeratori. I colori dell'arcobaleno sarebbero mappati in questo modo .:
Ora internamente, il compilatore utilizzerà un int per mantenerli e se non viene fornito alcun valore, il rosso sarà 0, l'arancione sarà 1 ecc.
Il punto è che rainbowcolors è un tipo e solo altre variabili dello stesso tipo possono essere assegnate a questo. C è più semplice (ovvero meno tipicamente), ma C ++ e C # non consentono l'assegnazione a meno che non venga forzata utilizzando un cast.
Non sei bloccato con questi compilatore valori generati, puoi assegnare loro la tua costante intera come mostrato qui.
Avere blu e indaco con lo stesso valore non è un errore in quanto gli enumeratori potrebbero includere sinonimi come scarlatto e cremisi.
Differenze linguistiche
In C, il variabile la dichiarazione deve essere preceduta dalla parola enum come in
In C ++, tuttavia, non è necessario come rainbowcolors è un tipo distinto che non necessita del prefisso del tipo enum.
In C # i valori sono accessibili dal nome del tipo come in
Qual è il punto di enum?
L'uso di enum aumenta il livello di astrazione e consente al programmatore di pensare a cosa significano i valori piuttosto che preoccuparsi di come sono memorizzati e accessibili. Ciò riduce il verificarsi di bug.
Ecco un esempio Abbiamo un set di semafori con tre lampadine- rosso, giallo e verde. Nel Regno Unito, la sequenza dei semafori cambia in queste quattro fasi.
- Rosso - Traffico interrotto.
- Tutti e due Rosso e Giallo - Il traffico è ancora fermo, ma le luci stanno per diventare verdi.
- verde - Il traffico può spostarsi.
- Giallo - Avviso di imminente cambio in rosso.
Esempio di semaforo
Le luci sono controllate scrivendo sui tre bit inferiori di un byte di controllo. Questi sono disposti come modello di bit sotto in binario dove RYG rappresenta i tre bit. Se R è 1, la luce rossa è accesa ecc.
In questo caso, è facile vedere che i quattro stati sopra corrispondono ai valori 4 = Rosso acceso, 6 = Rosso + Giallo entrambi attivi, 1 = verde acceso e 2 = Giallo su.
Con questa funzione
Usando una classe invece di Enums
In C ++ e C # avremmo bisogno di creare una classe e poi sovraccarico l'operatore | permettere O-ing di tipi semafori.
Usando gli enum evitiamo problemi con l'assegnazione di altri bit al byte di controllo della lampadina. È possibile che alcuni degli altri bit controllino l'autotest o un interruttore "Green Lane". In tal caso, un bug che consente di impostare questi bit nell'uso normale potrebbe provocare il caos.
A dire il vero, maschereremmo i bit nel file SetTrafficlights ()funzione quindi, indipendentemente dal valore passato, vengono modificati solo i tre bit inferiori.
Conclusione
Gli enum hanno questi vantaggi:
- Limitano i valori che la variabile enum può assumere.
- Ti costringono a pensare a tutti i possibili valori che l'enum può assumere.
- Sono una costante anziché un numero, aumentando la leggibilità di codice sorgente