Kort til opregning, en enum variabel type kan findes i C (ANSI, ikke den originale K&R), C ++ og C #. Ideen er, at i stedet for at bruge en int til at repræsentere et sæt værdier bruges i stedet en type med et begrænset sæt værdier.
For eksempel, hvis vi bruger regnbuens farver, som er
- Rød
- orange
- Gul
- Grøn
- Blå
- indigo
- Violet
Hvis der ikke eksisterer enums, kan du bruge en #Definere (i C) eller const i C ++ / C # for at specificere disse værdier. F.eks
For mange ints at tælle!
Problemet med dette er, at der er mange flere ints end farver. Hvis violet har værdien 7 og program tildeler en værdi på 15 til en variabel, så er det helt klart en fejl, men detekteres muligvis ikke, da 15 er en gyldig værdi for et int.
Enums to the Rescue
Enum er en brugerdefineret type bestående af et sæt navngivne konstanter kaldet enumerators. Regnbuens farver vil blive kortlagt sådan:
Nu internt bruger compileren en int til at holde disse, og hvis der ikke leveres nogen værdier, er rød 0, orange er 1 osv.
Pointen er det rainbowcolors
er en type, og kun andre variabler af samme type kan tildeles til denne. C er lettere at gå (dvs. mindre strengt skrevet), men C ++ og C # tillader ikke tildeling, medmindre du tvinger det ved hjælp af et rollebesætningsbillede.Du er ikke fast med disse compiler genererede værdier, kan du tildele dit eget heltalskonstant til dem som vist her.
At have blå og indigo med samme værdi er ikke en fejl, da tællere kan omfatte synonymer som skarlagensrøde og crimson.
Sprogforskelle
I C, variabel Erklæring skal indledes med ordet enum som i
I C ++ er det dog ikke nødvendigt som rainbowcolors er en forskellig type, der ikke har brug for enum-typen præfiks.
I C # får man adgang til værdierne med typenavn som i
Hvad er poenget med enums?
Brug af enums øger abstraktionsniveauet og lader programmøren tænke over, hvad værdierne betyder snarere end at bekymre sig om, hvordan de gemmes og får adgang til dem. Dette reducerer forekomsten af bugs.
Her er et eksempel. Vi har et sæt trafiklys med tre pærer- rød, gul og grøn. I Storbritannien ændres rækkefølgen af trafiklys i disse fire faser.
- Rød - Trafik stoppet.
- Begge Rød og Gul - Trafik stoppede stadig, men lyset er ved at skifte til grønt.
- Grøn - Trafik kan bevæge sig.
- Gul - Advarsel om forestående ændring til rødt.
Eksempel på trafiklys
Lysene styres ved at skrive til de tre nederste bit i en kontrolbyte. Disse er udformet som et bitmønster nedenfor i binært, hvor RYG repræsenterer de tre bit. Hvis R er 1, lyser det røde lys osv.
I dette tilfælde er det let at se, at de fire tilstande ovenfor svarer til værdier 4 = Rød på, 6 = Rød + Gul begge på, 1 = Grøn tændt og 2 = Gul på.
Med denne funktion
Brug af en klasse i stedet for enums
I C ++ og C # skulle vi oprette en klasse og derefter overbelaste operatøren | at tillade O ring af typer trafiklys.
Ved at bruge enums forhindrer vi, at problemer med andre bit tildeles pære kontrolbyten. Det kan være, at nogle af de andre bit styrer selvtest eller en "Green Lane" -afbryder. I dette tilfælde kan en bug, der tillader at disse bits indstilles under normal brug, ødelægge.
For at være sikker, ville vi maskere bitene i SetTrafficlights ()fungere så uanset hvilken værdi der sendes ind, ændres kun de tre nederste bit.
Konklusion
Enums har disse fordele:
- De begrænser de værdier, som enum-variablen kan tage.
- De tvinger dig til at tænke på alle de mulige værdier, som enum kan tage.
- De er et konstant snarere end et tal, hvilket øger læsbarheden af kildekode