Un tip “first-class citizens” din sistemul de tipuri oferit de .Net despre care nu am discutat foarte multe este Enum. Derivat din System.Enum care la randul lui este derivat din System.ValueType acest tip nu poate defini metode, proprietati sau evenimente.
Un Enum este folosit pentru a reprezenta un set de valori pe care programatorul le cunoaste, valori care sunt constante. Implicit, ele au un corespondent numeric.
De exemplu, o enumerare pentru un set de optiuni arata astfel:
enum Languages
{
None,
English,
French,
Italian
}
In acest caz None inseamna lipsa valorii. Corespondentii numerici pentru valorile din enumerare sunt : 0, 1, 2, 3. Utilizarea poate fi facut asa:
Languages selectedLanguage = Languages.English;
Un Enum poate fi declarat in interiorul unui spatiu de nume sau in interiorul unei clase.
Exista cazuri in care se pot atribui valori in mod explicit inregistrarilor dintr-o enumerare:
enum Languages
{
None = 10,
English = 20,
French = 30,
Italian = 40
}
Pentru a converti un Enum la un Int, si invers, trebuie ca programatorul sa faca in mod explicit conversia:
//valoarea numerica : 40 Console.WriteLine((int)Languages.Italian); //valoarea din enum: English Console.WriteLine((Languages)20);
Cand se incearca o conversie de la o valoare int la un tip de enumerare, de multe ori valoarea respectiva nu este valida, ea avand posibilitatea sa provina din mai multe locuri. Pentru acest caz, .Net Framework pune la dispozitie metoda IsDefined, care valideaza valoarea.
bool isDefined = System.Enum.IsDefined(typeof(Languages), 1); //false Console.WriteLine(isDefined);
Pentru afisarea unei liste cu toate valorile definite in cadrul unei enumerari se pot folosi metodele GetValues si GetNames:
//afiseaza toate valorile dintr-o enumerare foreach (Languages lang in System.Enum.GetValues(typeof(Languages))) { Console.WriteLine(System.Enum.GetName(typeof(Languages), lang)); }
Tipurile Enum aduc un plus in scrierea, citirea si mentenanta codului. Cu ajutorul numelor simbolice din cadrul enumerarii, programatorul nu va fi nevoit sa retina valoare corespunzatoare. In plus, in cazul schimbarii acesteia, este necesar doar recompilarea codului, fara alte modificari.