enum (Riferimenti per C#)
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 annidata all'interno di una classe o una struttura.
Per impostazione predefinita, al primo enumeratore viene assegnato il valore 0 e il valore di ciascun enumeratore successivo viene ottenuto incrementando di 1 il precedente. Ad esempio, nella seguente enumerazione Sat è 0, Sun è 1, Mon è 2 e così via.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
Gli enumeratori possono utilizzare gli inizializzatori per eseguire l'override dei valori predefiniti, come illustrato nell'esempio seguente.
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, si consiglia di includere una costante che ha il valore 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, come illustrato nell'esempio seguente:
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 vuoti 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 che possono essere 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 e l'analizzatore di espressioni. (Vedere il terzo esempio).
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 la sezione predefinita dell'istruzione switch può essere selezionata in modo imprevisto.
Se altri sviluppatori utilizzano il codice, è opportuno fornire indicazioni sui possibili risultati generati dal codice se verranno aggiunti nuovi elementi a qualsiasi tipo enum.
Esempio
Nell'esempio riportato di seguito, viene dichiarata un'enumerazione Days. Due enumeratori vengono convertiti in modo esplicito in valori di tipo 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
*/
Negli esempi riportati 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.
// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
// The flag for SunRoof is 0001.
SunRoof = 0x01,
// The flag for Spoiler is 0010.
Spoiler = 0x02,
// The flag for FogLights is 0100.
FogLights = 0x04,
// The flag for TintedWindows is 1000.
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
// The bitwise OR of 0001 and 0100 is 0101.
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
// Because the Flags attribute is specified, Console.WriteLine displays
// the name of each enum element that corresponds to a flag that has
// the value 1 in variable options.
Console.WriteLine(options);
// The integer value of 0101 is 5.
Console.WriteLine((int)options);
}
}
/* Output:
SunRoof, FogLights
5
*/
Commenti
Se si rimuove Flags, l'esempio mostra i seguenti valori:
5
5
Specifiche del linguaggio C#
Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.
Vedere anche
Riferimenti
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
Tipi di enumerazione (Guida per programmatori C#)
Altre risorse
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Dicembre 2010 |
Sono stati aggiunti commenti all'ultimo esempio. |
Commenti e suggerimenti dei clienti. |