Home Insegnanti Contattami Portfolio

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à.

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

  1. Leggibilità: Gli enum rendono il codice più leggibile, sostituendo valori numerici senza significato con nomi descrittivi.
  1. Sicurezza dei tipi: Gli enum migliorano la sicurezza dei tipi, limitando il range di valori accettabili per una variabile.
  1. Manutenibilità: Se i valori di un gruppo devono cambiare, è possibile aggiornare l'enum senza dover modificare il codice che lo utilizza.
  1. 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 &.