Condividi tramite


enum (Riferimenti per C#)

Aggiornamento: novembre 2007

La parola chiave enum viene utilizzata per dichiarare un'enumerazione, un tipo distinto formato da un insieme di costanti denominate definito elenco di enumeratori.

Generalmente è meglio definire un'enumerazione direttamente all'interno di uno spazio dei nomi in modo che tutte le classi nello spazio dei nomi possano accedervi con la stessa facilità. Tuttavia, un'enumerazione può anche essere nidificata all'interno di una classe o una struttura.

Per impostazione predefinita al primo enumeratore viene associato il valore 0 e il valore di ciascun enumeratore successivo viene ottenuto tramite incrementi di 1. Ad esempio:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

In questa enumerazione Sat è 0, Sun è 1, Mon è 2 e così via. Agli enumeratori è possibile applicare inizializzatori che consentono di ignorare i valori predefiniti. Di seguito è riportato un esempio:

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

In questa enumerazione, per la sequenza di elementi l'inizio viene imposto su 1 anziché su 0. Tuttavia, è consigliabile che un'enumerazione contenga una costante con un valore di 0. Per ulteriori informazioni, vedere Tipi di enumerazione (Guida per programmatori C#).

Ogni tipo di enumerazione dispone di un tipo sottostante, che può essere qualsiasi tipo integrale ad eccezione di char. Il tipo sottostante predefinito degli elementi dell'enumerazione è int. Per dichiarare un tipo enum di un altro tipo integrale, ad esempio byte, utilizzare un segno di due punti dopo l'identificatore seguito dal tipo:

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

I tipi approvati per un tipo enum sono byte, sbyte, short, ushort, int, uint, long, or ulong.

A una variabile di tipo Days può essere assegnato qualsiasi valore compreso nell'intervallo del tipo sottostante; i valori non sono limitati alle costanti denominate.

Il valore predefinito di un oggetto enum E è il valore prodotto dall'espressione (E)0.

Nota:

Un enumeratore non può contenere spazi nel proprio nome.

Il tipo sottostante specifica lo spazio di archiviazione allocato per ciascun enumeratore. Per operare una conversione dal tipo enum a un tipo integrale, è tuttavia necessario un cast esplicito. L'istruzione seguente, ad esempio, assegna l'enumeratore Sun a una variabile di tipo int utilizzando un cast per la conversione da enum a int:

int x = (int)Days.Sun;

Quando si applica System.FlagsAttribute a un'enumerazione che contiene alcuni elementi combinati con un'operazione OR bit per bit, si noterà che l'attributo influisce sul comportamento di enum quando viene utilizzato con alcuni strumenti. È possibile notare tali modifiche quando si utilizzano strumenti quali i metodi della classe Console, l'analizzatore di espressioni e così via. (Vedere l'esempio 3).

Programmazione robusta

Proprio come con qualsiasi costante, tutti i riferimenti ai singoli valori di un'enumerazione vengono convertiti in valori letterali numerici in fase di compilazione. Questa situazione può creare problemi potenziali di controllo della versione, come descritto in Costanti (Guida per programmatori C#).

L'assegnazione di valori aggiuntivi a nuove versioni di enumerazioni o la modifica dei valori dei membri enum in una nuova versione può causare problemi per il codice sorgente dipendente. I valori enum spesso sono utilizzati nelle istruzioni switch. Se ulteriori elementi sono stati aggiunti al tipo enum, il test dei valori predefiniti può restituire true in modo imprevisto.

Se altri sviluppatori utilizzeranno il codice, è opportuno fornire indicazioni sui possibili risultati generati dal codice se verranno aggiunti nuovi elementi a qualsiasi tipo enum.

Esempio

In questo esempio viene dichiarata l'enumerazione Days. Due enumeratori vengono convertiti in modo esplicito in valori integer e assegnati a variabili integer.

public class EnumTest
{
    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

Nell'esempio riportato di seguito, l'opzione tipo base viene utilizzata per dichiarare un enum i cui membri sono di tipo long. Anche se il tipo sottostante dell'enumerazione è long, i membri dell'enumerazione devono comunque essere convertiti in modo esplicito nel tipo long tramite un cast.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

Nell'esempio di codice riportato di seguito viene illustrato l'utilizzo e l'effetto dell'attributo System.FlagsAttribute su una dichiarazione enum.

[Flags]
public enum CarOptions
{
    SunRoof = 0x01,
    Spoiler = 0x02,
    FogLights = 0x04,
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Commenti

Si noti che se FlagsAttribute viene rimosso, nell'esempio si otterrà l'output riportato di seguito:

5

5

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 1.10 Enumerazioni

  • 6.2.2 Conversioni di enumerazione esplicite

  • 14 Enumerazioni

Vedere anche

Attività

Esempio di attributi

Concetti

Tipi di enumerazione (Guida per programmatori C#)

Progettazione di enumerazioni

Riferimenti

Parole chiave di C#

Tabella dei tipi integrali (Riferimenti per C#)

Tabella dei tipi incorporati (Riferimenti per C#)

Tabella delle conversioni numeriche implicite (Riferimenti per C#)

Tabella delle conversioni numeriche esplicite (Riferimenti per C#)

Altre risorse

Riferimenti per C#