Tipi di enumerazione (Guida per programmatori C#)

Un tipo di enumerazione (anche denominato enumerazione o enum) offre un modo efficiente per definire un insieme di costanti integrali denominate che possono essere assegnate a una variabile. Si presupponga ad esempio di dover definire una variabile il cui valore rappresenterà un giorno della settimana. Ci sono solo sette valori significativi che la variabile potrà mai archiviare. Per definire tali valori, è possibile utilizzare un tipo di enumerazione, dichiarato tramite la parola chiave enum.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

Per impostazione predefinita, il tipo sottostante di ogni elemento dell'enumerazione è int. È possibile specificare un altro tipo numerico integrale utilizzando i due punti, come mostrato nell'esempio precedente. Per un elenco completo dei tipi possibili, vedere enum (Riferimenti per C#).

I seguenti sono i vantaggi dell'utilizzo di un enum invece di un tipo numerico:

  • Si specifica in modo chiaro per il codice client quali sono i valori validi per la variabile.

  • In Visual Studio, IntelliSense elenca i valori definiti.

Quando non si specificano valori per gli elementi nell'elenco di enumeratori, i valori vengono incrementati automaticamente di 1. Nell'esempio precedente, Days.Sunday ha un valore 0, Days.Monday ha un valore 1 e così via. Quando si crea un nuovo oggetto Days, questo avrà un valore predefinito di Days.Sunday (0) se non si assegna un valore in modo esplicito. Quando si crea un enum, selezionare il valore predefinito più logico e assegnarvi un valore di zero. In tal modo tutti gli enum avranno quel valore predefinito se non è stato loro assegnato un valore in modo esplicito al momento della creazione.

Se la variabile meetingDay è di tipo Days, è possibile assegnare (senza un cast esplicito) solo uno dei valori definiti da Days. E se il giorno della riunione cambia, è possibile assegnare un nuovo valore da Days a meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

Nota

È possibile assegnare qualsiasi valore intero arbitrario a meetingDay. Ad esempio, questa riga di codice non produce un errore: meetingDay = (Days) 42. Tuttavia, questa impostazione non è consigliabile perché l'aspettativa implicita è che una variabile enum contenga solo uno dei valori definiti dal tipo enum. L'assegnazione di un valore arbitrario a una variabile di un tipo di enumerazione introduce un rischio elevato di errori.

È possibile assegnare qualsiasi valore agli elementi nell'elenco di enumeratori di un tipo di enumerazione ed è inoltre possibile utilizzare valori calcolati:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

Tipi di enumerazione come flag di bit

È possibile utilizzare un tipo di enumerazione per definire flag di bit, che consentono a un'istanza del tipo di enumerazione di archiviare qualsiasi combinazione dei valori definiti nell'elenco di enumeratori (chiaramente, alcune combinazioni potrebbero non essere significative o consentite nel codice del programma).

Un enum di flag di bit viene creato applicando l'attributo System.FlagsAttribute e definendo in modo appropriato i valori in modo che sia possibile eseguirvi operazioni bit per bit AND, OR, NOT e XOR. In un enum di flag di bit, includere una costante denominata con un valore di zero che indica che non sono impostati flag. Non fornire a un flag un valore di zero se non per indicare che non sono impostati flag.

Nell'esempio seguente, viene definita un'altra versione dell'enum Days, denominato Days2. Days2 dispone dell'attributo Flags e a ogni valore viene assegnata la successiva maggiore potenza di 2. In questo modo è possibile creare una variabile Days2 il cui valore è Days2.Tuesday e Days2.Thursday.

    [Flags]
    enum Days2
    {
        None = 0x0,
        Sunday = 0x1,
        Monday = 0x2,
        Tuesday = 0x4,
        Wednesday = 0x8,
        Thursday = 0x10,
        Friday = 0x20,
        Saturday = 0x40
    }
    class MyClass
    {
        Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
    }

Per impostare un flag su un enum, utilizzare l'operatore OR bit per bit come mostrato nell'esempio seguente:

// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Per determinare se un flag specifico è impostato, utilizzare l'operatore AND bit per bit come mostrato nell'esempio seguente:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Per ulteriori informazioni sugli aspetti da considerare quando si definiscono tipi di enumerazione con l'attributo System.FlagsAttribute, vedere System.Enum.

Utilizzo dei metodi System.Enum per individuare e modificare valori enum

Tutti gli enum sono istanze del tipo System.Enum. Non è possibile derivare nuove classi da System.Enum, ma è possibile utilizzarne i metodi per individuare informazioni e modificare valori in un'istanza dell'enum.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

Per ulteriori informazioni, vedere la classe System.Enum.

È inoltre possibile creare un nuovo metodo per un enum tramite un metodo di estensione. Per ulteriori informazioni, vedere Procedura: creare un nuovo metodo per una enumerazione (Guida per programmatori C#).

Vedere anche

Riferimenti

enum (Riferimenti per C#)

System.Enum

Concetti

Guida per programmatori C#