Scurt pentru enumerare, o enumerare tip variabil poate fi găsit în C (ANSI, nu K&R original), C ++ și C #. Ideea este că în loc să folosești un int pentru a reprezenta un set de valori, se utilizează în schimb un tip cu un set restrâns de valori.
De exemplu, dacă folosim culorile curcubeului, care sunt
- roșu
- portocale
- Galben
- Verde
- Albastru
- Indigo
- violet
Dacă enumerațiile nu ar exista, puteți utiliza o #defini (în C) sau const în C ++ / C # pentru a specifica aceste valori. De exemplu
Prea multe int-uri de numărat!
Problema cu aceasta este că sunt multe altele Ints decât culorile. Dacă violeta are valoarea 7, și program atribuie o valoare de 15 unei variabile, atunci este în mod clar un bug, dar nu poate fi detectat, deoarece 15 este o valoare valabilă pentru o int.
Enume la salvare
Un enum este un tip definit de utilizator constând dintr-un set de constante numite numite enumeratori. Culorile curcubeului vor fi asortate astfel:
Acum, intern, compilatorul va folosi o int pentru a reține aceste și dacă nu sunt furnizate valori, roșu va fi 0, portocaliu este 1 etc.
Ideea este că rainbowcolors este un tip și pot fi atribuite numai alte variabile de același tip. C merge mai ușor (adică mai puțin strict tastat), dar C ++ și C # nu vor permite alocarea decât dacă o forțați folosind o distribuție.
Nu ești blocat cu acestea compilator valorile generate, puteți să le atribuiți propria constantă integrală așa cum se arată aici.
A avea albastru și indigo cu aceeași valoare nu este o greșeală, deoarece enumeratorii ar putea include sinonime precum stacojiu și crem.
Diferențele de limbă
În C, variabil declarația trebuie să fie precedată de cuvânt enum ca în
Cu toate acestea, în C ++, nu este necesar ca rainbowcolors este un tip distinct care nu are nevoie de prefixul tip enum.
În C #, valorile sunt accesate de numele tipului ca în
Care este punctul Enumelor?
Folosirea enumerărilor crește nivelul de abstractizare și permite programatorului să se gândească la ce înseamnă valorile, în loc să vă îngrijoreze modul în care sunt stocate și accesate. Acest lucru reduce apariția de erori.
Iată un exemplu. Avem un set de semafoare cu trei becuri- roșu, galben și verde. În Marea Britanie, succesiunea semafoarelor se schimbă în aceste patru faze.
- roșu - Trafic oprit.
- Ambii roșu și Galben - Traficul încă oprit, dar luminile sunt pe cale să se schimbe la verde.
- Verde - Traficul se poate deplasa.
- Galben - Avertisment privind schimbarea iminentă în roșu.
Exemplu de semafor
Luminile sunt controlate prin scrierea în partea de jos a trei biți a unui octet de control. Acestea sunt prezentate ca un model de biți de mai jos în binar unde RYG reprezintă cei trei biți. Dacă R este 1, lumina roșie este aprinsă etc.
În acest caz, este ușor de observat că cele patru stări de mai sus corespund valorilor 4 = roșu pe, 6 = roșu + Galben atât pe, 1 = Verde pe și 2 = Galben pe.
Cu această funcție
Folosirea unei clase în loc de Enume
În C ++ și C # ar trebui să creăm o clasă și apoi suprasarcină operatorul | a permite SAU-ing de tipuri semafor.
Folosind enumere, prevenim ca problemele cu alți biți să fie alocați octețului de control al becului. S-ar putea ca unele dintre celelalte biți să controleze auto-testarea sau un comutator „Green Lane”. În acest caz, o eroare care permite setarea acestor biți în utilizare normală poate provoca ravagii.
Pentru a fi siguri, am ascunde bucățile din SetTrafficlights ()funcţie deci indiferent ce valoare este transmisă, se modifică doar cei trei biți de jos.
Concluzie
Enumele au aceste avantaje:
- Acestea restricționează valorile pe care le poate lua variabila enum.
- Te obligă să te gândești la toate valorile posibile pe care le poate lua enumerul.
- Ele sunt o constantă mai degrabă decât un număr, crescând lizibilitatea cod sursa