Che cos'è un enum nei linguaggi di programmazione?
Richard Drury/Iconica/Getty Images
Abbreviazione di enumerazione, enum tipo variabile può essere trovato in C (ANSI, non il K&R originale), C++ eC#. 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 le enumerazioni non esistessero, potresti usare a #definire (in C) o cost in C++/C# per specificare questi valori. Per esempio
Troppi Int da contare!
Il problema è che ce ne sono molti di più int rispetto ai colori. Se 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.
Enumerazioni in soccorso
Un enum è un tipo definito dall'utente costituito da un insieme di costanti denominate denominate enumeratori. I colori dell'arcobaleno sarebbero mappati in questo modo:
Ora internamente, il compilatore utilizzerà un int per contenerli e se non vengono forniti valori, il rosso sarà 0, l'arancione è 1 ecc.
Qual è il vantaggio di un enum?
Il punto è che colori arcobaleno è un tipo e a questo possono essere assegnate solo altre variabili dello stesso tipo. Il C è più semplice (cioè digitato in modo meno rigoroso), ma C++ e C# non consentiranno l'assegnazione a meno che non lo si forzi usando 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 poiché 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 colori arcobaleno è un tipo distinto che non necessita del prefisso del tipo enum.
In C# si accede ai valori dal nome del tipo come in
Qual è il punto di enumerazioni?
L'uso delle enumerazioni aumenta il livello di astrazione e consente al programmatore di pensare a cosa significano i valori piuttosto che preoccuparsi di come vengono archiviati e accessibili. Ciò riduce il verificarsi di bug.
Ecco un esempio. Abbiamo una serie di semafori con tre lampadine- rosso , giallo e verde . Nel Regno Unito, la sequenza dei semafori cambia in queste quattro fasi.
- Tutti e due Rosso e Giallo - Traffico ancora fermo, ma il semaforo sta per passare al verde.
- Limitano i valori che la variabile enum può assumere.
- Ti costringono a pensare a tutti i possibili valori che l'enumerazione può assumere.
- Sono una costante piuttosto che un numero, aumentando la leggibilità del file codice sorgente
Esempio di semaforo
Le luci sono controllate scrivendo nei tre bit inferiori di un byte di controllo. Questi sono disposti come uno schema di bit di seguito in binario in cui RYG rappresentano 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 accesi, 1 = Verde acceso e 2 = Giallo Su.
Con questa funzione
Usare una classe invece di enumerazioni
In C++ e C# dovremmo creare una classe e poi sovraccarico l'operatore | permettere OR-ing di tipi semafori .
Usando le enumerazioni evitiamo problemi con altri bit assegnati al byte di controllo della lampadina. Potrebbe essere 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 causare il caos.
Per essere sicuri, maschereremmo i bit nel Imposta semafori() funzione quindi, indipendentemente dal valore passato, vengono modificati solo i tre bit inferiori.
Conclusione
Gli enum hanno questi vantaggi: