Enumerații în C#
În afară de tipurile de date primitive, în limbajul de programare C# există tipul enum sau enumerare. Enumerațiile reprezintă un set de constante logic legate.
Declarația unei enumerații se face folosind operatorul enum:
enum NumeEnumeratie
{
Valoare1,
Valoare2,
// .......
ValoareN
}
După cuvântul cheie enum urmează numele enumerației. Apoi, în acolade, sunt enumerate constantel.
Declarația unei enumerații simple:
enum DayTime
{
Morning,
Afternoon,
Evening,
Night
}
Aici este definită enumerația DayTime, care are patru valori: Morning, Afternoon, Evening și Night.
Fiecare enumerație definește de fapt un nou tip de date, cu ajutorul căruia putem declara variabile, constante, parametri de metodă etc. Valoarea unei variabile, constante sau parametru de metodă care reprezintă o enumerație trebuie să fie una dintre constantele acestei enumerații:
const DayTime dayTime = DayTime.Morning;
În program, putem folosi astfel de variabile/constante/parametri ca orice alte tipuri:
DayTime dayTime = DayTime.Morning;
if(dayTime == DayTime.Morning)
Console.WriteLine("Bună dimineața");
else
Console.WriteLine("Salut");
enum DayTime
{
Morning,
Afternoon,
Evening,
Night
}
Stocarea stării
Adesea, o variabilă de tip enumerație acționează ca un depozit de stare, în funcție de care se efectuează anumite acțiuni:
DayTime now = DayTime.Evening;
PrintMessage(now); // Bună seara
PrintMessage(DayTime.Afternoon); // Bună ziua
PrintMessage(DayTime.Night); // Noapte bună
void PrintMessage(DayTime dayTime)
{
switch (dayTime)
{
case DayTime.Morning:
Console.WriteLine("Bună dimineața");
break;
case DayTime.Afternoon:
Console.WriteLine("Bună ziua");
break;
case DayTime.Evening:
Console.WriteLine("Bună seara");
break;
case DayTime.Night:
Console.WriteLine("Noapte bună");
break;
}
}
enum DayTime
{
Morning,
Afternoon,
Evening,
Night
}
Aici metoda PrintMessage() primește ca parametru o valoare de tipul enumerației DayTime și, în funcție de această valoare, afișează un mesaj corespunzător.
Alt exemplu:
DoOperation(10, 5, Operation.Add); // 15
DoOperation(10, 5, Operation.Subtract); // 5
DoOperation(10, 5, Operation.Multiply); // 50
DoOperation(10, 5, Operation.Divide); // 2
void DoOperation(double x, double y, Operation op)
{
double result = op switch
{
Operation.Add => x + y,
Operation.Subtract => x - y,
Operation.Multiply => x * y,
Operation.Divide => x / y,
_ => 0
};
Console.WriteLine(result);
}
enum Operation
{
Add,
Subtract,
Multiply,
Divide
}
Aici este definită enumerația Operation, care reprezintă operațiile aritmetice. Fiecare tip de operație este definit ca una dintre constantele enumerației. De asemenea, este definită metoda DoOperation(), care primește doi operanzi și un tip de operație și, în funcție de acest tip, returnează rezultatul operației respective.
Tipul și valorile constantelor enumerației
Constantele enumerației pot avea un tip specific. Tipul este specificat după numele enumerației, folosind două puncte:
enum Time : byte
{
Morning,
Afternoon,
Evening,
Night
}
Tipul enumerației trebuie să fie un tip întreg (byte, sbyte, short, ushort, int, uint, long, ulong). Dacă tipul nu este specificat explicit, implicit este int.
Tipul afectează valorile pe care le pot avea constantele. Implicit, fiecărui element al enumerației i se atribuie o valoare întreagă, primul element având valoarea 0, al doilea - 1 și așa mai departe. De exemplu, să luăm enumerația DayTime definită anterior:
DayTime now = DayTime.Morning;
Console.WriteLine((int) now); // 0
Console.WriteLine((int) DayTime.Night); // 3
enum DayTime
{
Morning,
Afternoon,
Evening,
Night
}
Putem folosi operația de conversie pentru a obține valoarea întreagă a unei constante din enumerație:
(int) DayTime.Night // 3
Cu toate acestea, nu putem atribui o valoare numerică direct unei variabile de tip enumerație:
DayTime now = 2; // ! Eroare
Putem specifica explicit valorile elementelor, fie specificând valoarea primului element:
enum DayTime
{
Morning = 3, // fiecare element următor crește automat cu unu
Afternoon, // acest element are valoarea 4
Evening, // 5
Night // 6
}
Sau putem specifica valorile pentru toate elementele:
enum DayTime
{
Morning = 2,
Afternoon = 4,
Evening = 8,
Night = 16
}
Constantele enumerației pot avea aceleași valori sau putem atribui unei constante valoarea alteia:
enum DayTime
{
Morning = 1,
Afternoon = Morning,
Evening = 2,
Night = 2
}