Condividi tramite


enum (Riferimenti per C#)

La parola chiave enum viene utilizzata per dichiarare un'enumerazione, un tipo distinto formato da una serie di costanti denominate definite elenco degli enumeratori. 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 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.

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 tipo 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 l'attributo 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

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. Questa situazione si verifica spesso nel caso in cui i valori enum vengano utilizzati in istruzioni switch e, se sono stati aggiunti elementi supplementari al tipo enum, il test dei valori predefiniti può restituire true in modo imprevisto.

Se altri sviluppatori utilizzeranno il codice, è importante fornire indicazioni su come il codice reagirà se verranno aggiunti nuovi elementi a tutti i tipi 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.

// keyword_enum.cs
// enum initialization:
using System;
public class EnumTest 
{
    enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

    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 = 2
Fri = 7

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.

// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest 
{
    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.

// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;

[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 si rimuove l'inizializzatore da Sat=1, il risultato sarà il seguente:

Sun = 1
Fri = 6

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

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#)

Concetti

Guida per programmatori C#
Progettazione di enumerazioni

Altre risorse

Riferimenti per C#