Enums
1️⃣ Cos'è un Enum?
In C#, un enum
(abbreviazione di "enumeration") è un tipo di dato speciale che permette di definire un insieme di costanti con nome. Gli enum
sono particolarmente utili quando si ha un gruppo di valori strettamente correlati e non cambieranno nel tempo, come i giorni della settimana, i colori, o i livelli di priorità.
Gli enum
migliorano la leggibilità del codice, riducendo l'uso di numeri "magici" e rendendo più chiaro il significato di certi valori all'interno del codice.
Dichiarazione di base di un enum
:
enum GiornoDellaSettimana
{
Lunedì,
Martedì,
Mercoledì,
Giovedì,
Venerdì,
Sabato,
Domenica
}
In questo esempio, GiornoDellaSettimana
è un enum
che rappresenta i giorni della settimana.
2️⃣ Come funzionano gli Enum
Per default, il primo valore di un enum
è associato a 0
, il secondo a 1
, e così via. Tuttavia, è possibile specificare valori diversi per ciascun membro.
Assegnazione di valori personalizzati:
enum LivelloPriorità
{
Bassa = 1,
Media = 2,
Alta = 3,
Critica = 4
}
In questo caso, Bassa
è associato al valore 1
, Media
a 2
, e così via. Gli enum
possono essere di qualsiasi tipo intero (int
è il default), come byte
, short
, long
, ma non possono essere di tipo float
o double
.
3️⃣ Utilizzo di un Enum
Per utilizzare un enum
, basta dichiarare una variabile del tipo dell'enum
e assegnarle uno dei valori definiti nell'enum
.
Esempio di utilizzo:
LivelloPriorità priorità = LivelloPriorità.Alta;
Console.WriteLine(priorità); // Output: Alta
Console.WriteLine((int)priorità); // Output: 3
In questo esempio, abbiamo assegnato il valore Alta
alla variabile priorità
e stampato sia il valore del nome (Alta
) sia il valore numerico associato (3
).
4️⃣ Conversione tra Enum e altri tipi
Gli enum
possono essere convertiti in stringhe e numeri interi, permettendo una maggiore flessibilità.
- Convertire un Enum in stringa:
LivelloPriorità priorità = LivelloPriorità.Media; string nomePriorità = priorità.ToString(); Console.WriteLine(nomePriorità); // Output: Media
- Convertire un numero in un Enum:
int valore = 2; LivelloPriorità priorità = (LivelloPriorità)valore; Console.WriteLine(priorità); // Output: Media
- Convertire una stringa in un Enum:
Con il metodo
Enum.Parse
, si può convertire una stringa nel valore corrispondente dell'enum:string nomePriorità = "Critica"; LivelloPriorità priorità = (LivelloPriorità)Enum.Parse(typeof(LivelloPriorità), nome Priorità); Console.WriteLine(priorità); // Output: Critica
5️⃣ Esempio completo: Gestione dei livelli di accesso
Vediamo un esempio completo di utilizzo degli enum
per gestire i livelli di accesso di un sistema.
using System;
enum LivelloAccesso
{
Utente = 1,
Moderatore = 2,
Amministratore = 3,
SuperAmministratore = 4
}
class Program
{
static void Main()
{
LivelloAccesso accessoUtente = LivelloAccesso.Moderatore;
Console.WriteLine("Livello di accesso: " + accessoUtente);
switch (accessoUtente)
{
case LivelloAccesso.Utente:
Console.WriteLine("Accesso di base.");
break;
case LivelloAccesso.Moderatore:
Console.WriteLine("Accesso con permessi di moderazione.");
break;
case LivelloAccesso.Amministratore:
Console.WriteLine("Accesso con permessi di amministrazione.");
break;
case LivelloAccesso.SuperAmministratore:
Console.WriteLine("Accesso completo al sistema.");
break;
}
}
}
/* Output:
Livello di accesso: Moderatore
Accesso con permessi di moderazione.
*/
In questo esempio, l’enum
LivelloAccesso
definisce diversi livelli di accesso, e tramite un switch
possiamo gestire diverse logiche a seconda del livello dell’utente.
6️⃣ Vantaggi dell'uso degli Enum
- Leggibilità: Gli
enum
rendono il codice più leggibile, sostituendo valori numerici senza significato con nomi descrittivi.
- Sicurezza dei tipi: Gli
enum
migliorano la sicurezza dei tipi, limitando il range di valori accettabili per una variabile.
- Manutenibilità: Se i valori di un gruppo devono cambiare, è possibile aggiornare l'enum senza dover modificare il codice che lo utilizza.
- Codice pulito: Evitano l'uso di "magic numbers" nel codice, migliorando la pulizia e comprensione del codice.
7️⃣ Enumerazioni con Flags
L'attributo [Flags]
permette di usare gli enum
come set di flag, permettendo la combinazione di più valori con operazioni bitwise.
Esempio di enum
con Flags
:
[Flags]
enum Permessi
{
Leggi = 1, // 0001 in binario
Scrivi = 2, // 0010 in binario
Modifica = 4, // 0100 in binario
Cancella = 8 // 1000 in binario
}
class Program
{
static void Main()
{
Permessi permessiUtente = Permessi.Leggi | Permessi.Scrivi;
Console.WriteLine(permessiUtente); // Output: Leggi, Scrivi
// Controllo se ha permesso di leggere
if ((permessiUtente & Permessi.Leggi) == Permessi.Leggi)
{
Console.WriteLine("Permesso di lettura concesso.");
}
// Aggiungere il permesso di modifica
permessiUtente |= Permessi.Modifica;
Console.WriteLine(permessiUtente); // Output: Leggi, Scrivi, Modifica
}
}
/* Output:
Leggi, Scrivi
Permesso di lettura concesso.
Leggi, Scrivi, Modifica
*/
In questo esempio, con l'attributo [Flags]
, possiamo combinare vari permessi usando l'operatore |
, e verificare i permessi con l'operatore &
.