fel
le

Felsorolás típus

A felsorolás (enumeration) típust akkor használjuk, amikor valamely változónk több mint kettő, de véges (nem túl sok) értéket kívánunk tárolni.

Ha csak két különböző értékünk lehet, akkor arra kíválóan alkalmas a bool típus. Ha mondjuk már három értékünk lehet (pl: kő, papír, olló), akkor nem találunk megfelelő típust. Persze lehet próbálkozni. Szokásos ekkor valamiféle kódolást bevezetni. Karakter típus esetén lehet ez a 'K'=kő, 'P'=papír, 'O'=olló karakterek választása. Egész szám típus esetén lehet a 0=kő, 1=papír, 2=olló választás. Vizsgáljuk meg, hogyan tudnánk kiíró függvényt készíteni:

static void kiiras(char c)
{
  if (c=='K') Console.Write("kő");
  else if (c=='P') Console.Write("papír");
  else if (c=='O') Console.Write("olló");
  else Console.Write("???");
}
// --
// hívás
//
kiiras('K');
 

Ha a függvényünk char paramétert vár, mindíg fel kell készülnünk arra, hogy nem az általunk kívánt/kezelt három lehetséges értékek egyike fog érkezni paraméterként (külön kérdés a kis-nagybetű problémája). Hasonlóval találkozhatunk ha int''-el dolgozunk.

Hogyan tudnánk garantálni, hogy a c változónk csakis a megfelelő értékek közül vesz fel egy értéket?

Felsorolás deklarációja

1. ábra: A 'jatek' tipus deklarációja
// --
// típus deklarációja
// ---
enum jatek {ko, papir, ollo}
// --
// a függvény
// --
static void kiiras(jatek c)
{
  if (c==jatek.ko) Console.Write("kő");
  else if (c==jatek.papir) Console.Write("papír");
  else if (c==jatek.ollo) Console.Write("olló");
}
// --
// hívás
//
kiiras(jatek.ollo);
 

Az enum típusra működik a switch is:

static void kiiras(jatek c)
{
   switch(c)
   {
      case jatek.ko:
           Console.Write("kő");
           break;
      case jatek.papir:
           Console.Write("papír");
           break;
      case jatek.ollo:
           Console.Write("olló");
           break;
     
   }
}
 

Enum bekérése billentyűzetről

Lehetséges az enum típusú adatok bekérése billentyűzetről. Hasonlóan a többi egyszerű adattípushoz, létezik enum.Parse''. Ez azonban univerzális enum.Parse'', az enum bármilyen konkrét esetére alkalmazható. Ezért a paraméterezése is bonyolultabb, a feldolgozandó stringen felül meg kell adni a konkrét enum típus nevét is, hogy a parse felderíthesse milyen kulcsszavak a felismerhetők. Ezen felül az enum.Parse eredményének a típusával is gond van. Azt össze kell egyeztetni a bal oldal típusával. Ezért az enum-Parse visszatérési értékére még egy típuskényszerítést is kell alkalmazni.

Console.WriteLine("Írja be ko|papir|ollo szavak valamelyikét");
 string s = Console.ReadLine();
 jatek c = (jatek)enum.Parse(typeof(jatek), s);
 

Enum kiírása a képernyőre

Az enum típusú adatokat ki lehet íratni direkt módon is a képernyőre. Ekkor a megfelelő kulcsszó íródik ki:

jatek c = jatek.ollo;
 Console.Write("c={0}",c); // "c=ollo"
 

Háttérinformációk

Az enum-ra épített típusok mindegyike alapvetően int típusú. Amikor az enum lehetséges értékeit felsoroljuk, a fordító 'lélekben' generál hozzájuk egy sorszámot, és magát a sorszám értékét tárolja el. A jatek.ko lényegében egy konstans, melynek értéke 0, a jatek.papir értéke 1, jatek.ollo pedig a 2.

Ezt befolyásolni is tudjuk az enum deklarálása közben:

enum munkaNapok = {hetfo=1, kedd, szerda, csutortok, pentek}
 

A hetfo=1 sugallja a fordítónak, hogy ezen konstans értéke legyen 1. A további konstansok sorszámát folytatólagosan osztja ki, a kedd már 2 lesz, a szerda pedig 3, stb.

enum userSzintek = { kezdo=100, felprofi = 200, profi, mester = 300, nagymester  }
 

A lehetséges számértékeket (kódokat) az int értéktartományából lehet választani. Ennek megfelelően egy enum típusú változó is valójában egy int, s így a tárolási igénye 4 byte. A tárolás során tényleges a kódérték kerül be a memóriába.

Ennek megfelelően egy enum és egy int között létezik explicit típuskonverzió:

userSzintek c = userSzintek.mester;
 int kod = (int)c;                   // kod = 300 lesz

 kod = kod + 1;
 userSzintek m = (userSzintek)kod;   // m a 'nagymester' lesz
 
Hernyák Zoltán
2013-01-24 17:52:36