Il tipo enumerazione (enum)

Il tipo enumerazione (detto anche enum) rappresenta un modo efficiente per definire un insieme di costanti di tipo intero associate ad un nome e che possono essere assegnate a una variabile. È utile utilizzare gli enum quando delle variabili assumono dei valori specifici che corrispondono a nomi specifici come accade per esempio per i giorni di una settimana o per i mesi di un anno. Facciamo un esempio:


enum Giorno
{
     Lunedì,
     Martedì,
     Mercoledì,
     Giovedì,
     Venerdì,
     Sabato,
     Domenica
}

In questo caso abbiamo definito un nuovo tipo enumerativo costituito dai giorni della settimana e automaticamente sono associati a numeri di tipo intero (int) partendo da 0 per lunedì, 1 per martedì e così via.

Volendo possiamo definire variabili di tipo Giorno e poi eseguire dei confronti con il tipo enumerativo rendendo il codice molto più leggibile rispetto all’uso delle costanti intere come meglio chiarito dall’esempio che segue:


static void Main(string[] args)
{

    Giorno x = Giorno.Lunedì;

    if (x == Giorno.Lunedì)
    {
        Console.WriteLine("x={0}", x);
	Console.WriteLine("x={0}", (int)x);
    }

    Giorno y = Giorno.Martedì;

    if (y == Giorno.Martedì)
    {
        Console.WriteLine("y={0}", y);
        Console.WriteLine("y={0}", (int)y);
    }

}

Da notare che la l’istruzione Console.WriteLine(“x={0}”, x); stampa il nome del giorno, mentre l’istruzione Console.WriteLine(“x={0}”, (int)x); stampa il numero corrispondente al giorno.

Volendo possiamo cambiare sia in numero da cui partire, quindi per esempio utilizzare per lunedì il numero 1, che cambiare il tipo base sottostante, quindi avendo solo 7 giorni basterebbe il tipo byte, pertanto possiamo ridefinire il tipo Giorno come:


enum Giorno: byte
{
    Lunedì = 1,
    Martedì = 2,
    Mercoledì = 3,
    Giovedì = 4,
    Venerdì = 5,
    Sabato = 6,
    Domenica = 7
}

Gli enum sono usati quando dei nomi sono associati a dei numeri e nel programma vogliamo usare i nomi al posto dei numeri per rendere il codice più leggibile, ma anche come parametri nei metodi per limitare i valori dei parametri ai soli valori definiti dal tipo enumerativo utilizzando il nome e non il valore diventano di conseguenza più semplice e veloce lo sviluppo. Per esempio ipotizzando di avere un metodo (parleremo successivamente di metodi) che ha come parametro un Giorno potremmo richiamarlo usando le costanti definite nell’enum come riportato nell’esempio:


static void Main(string[] args)
{
		StampaGiorno(Giorno.Lunedì);
}

static void StampaGiorno(Giorno x)
{
	Console.WriteLine("x={0}", x);
	Console.WriteLine("x={0}", (byte)x);
}

Come possiamo notare nella chiamata del metodo statico abbiamo usano il nome e non il valore.

Mentre se voglio accedere a tutte le costanti di un enum devo utilizzare la class System.Enum che mi offre dei metodi a tal proposito.

In particolare il metodo GetValues prende il tipo e restituisce un array con tutti i valori. GetValues ha bisogno del tipo (System.Type) pertanto occorre utilizzare la funzione typeof che restituisce il tipo associato ad un oggetto:


foreach(Giorno x in Enum.GetValues(typeof(Giorno)))
{
    Console.WriteLine("x={0}", x);
    Console.WriteLine("x={0}", (byte)x);
}

Potrei accedere ai soli valori interi (byte) attraverso lo stesso ciclo ma si esegue direttamente un cast a byte:


foreach (byte x in Enum.GetValues(typeof(Giorno)))
{
    Console.WriteLine("x={0}", x);
}

Oppure utilizzando il metodo GetNames posso eseguire direttamente un cast a string per ottenere i nomi


foreach (string x in Enum.GetNames(typeof(Giorno)))
{
    Console.WriteLine("x={0}", x);
}

Infine, se ho direttamente un numero, o una variabile intera, il cui valore è letto da un database o da un file e voglio inizializzare una variabile di tipo Giorno seguo la seguente sintassi:


int numero = 1;

Giorno x = (Giorno)numero;

if(x == Giorno.Lunedì)
{
	Console.WriteLine("x={0}", x);
	Console.WriteLine("x={0}", (byte)x);
}

in questo caso x è un lunedì ipotizzando di usare la dichiarazione in cui lunedì è associato al valore 1.

 

INDICE