Tipi di enumerazione (riferimenti per C#)

Un tipo di enumerazione (o tipo enum) è un tipo valore definito da un set di costanti denominate del tipo numerico integrale sottostante. Per definire un tipo di enumerazione, usare la parola chiave enum e specificare i nomi dei membri enumerazione:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Per impostazione predefinita, i valori costanti associati dei membri enumerazione sono di tipo int; iniziano con zero e aumentano di uno dopo l'ordine di testo della definizione. È possibile specificare in modo esplicito qualsiasi altro tipo numerico integrale come tipo sottostante di un tipo di enumerazione. È anche possibile specificare in modo esplicito i valori costanti associati, come illustrato nell'esempio seguente:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

Non è possibile definire un metodo all'interno della definizione di un tipo di enumerazione. Per aggiungere funzionalità a un tipo di enumerazione, creare un metodo di estensione.

Il valore predefinito di un tipo E di enumerazione è il valore prodotto dall'espressione (E)0, anche se zero non ha il membro enumerazione corrispondente.

Si usa un tipo di enumerazione per rappresentare una scelta tra un set di valori che si escludono a vicenda o una combinazione di scelte. Per rappresentare una combinazione di scelte, definire un tipo di enumerazione come flag di bit.

Tipi di enumerazione come flag di bit

Se si desidera che un tipo di enumerazione rappresenti una combinazione di scelte, definire i membri enumerazione per tali scelte in modo che una singola scelta sia un campo di bit. Ovvero, i valori associati di tali membri enumerazione devono essere i poteri di due. Quindi, è possibile usare gli operatori logici bit per bit| o & per combinare le scelte o intersecare le combinazioni di scelte, rispettivamente. Per indicare che un tipo di enumerazione dichiara i campi di bit, applicare l'attributo Flags. Come illustrato nell'esempio seguente, è anche possibile includere alcune combinazioni tipiche nella definizione di un tipo di enumerazione.

[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}

Per altre informazioni ed esempi, vedere la pagina di riferimento dell'API System.FlagsAttribute e la sezione membri non esclusivi e Attributi Flags della pagina di riferimento dell'API System.Enum.

Tipo enumerazione System.Enum e vincolo enumerazione

Il tipo System.Enum è la classe base astratta di tutti i tipi di enumerazione. Fornisce diversi metodi per ottenere informazioni su un tipo di enumerazione e i relativi valori. Per altre informazioni ed esempi, vedere la pagina di riferimento dell'API System.Enum.

È possibile usare System.Enum in un vincolo di classe base (noto come vincolo enum) per specificare che un parametro di tipo è un tipo di enumerazione. Qualsiasi tipo di enumerazione soddisfa anche il vincolo struct, che viene usato per specificare che un parametro di tipo è un tipo di valore che non ammette i valori Null.

Conversioni

Per qualsiasi tipo di enumerazione, esistono conversioni esplicite tra il tipo di enumerazione e il tipo integrale sottostante. Se si esegue il cast di un valore di enumerazione al tipo sottostante, il risultato è il valore integrale associato di un membro enumerazione.

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");  // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);  // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);  // output: 4
    }
}

Utilizzare il metodo Enum.IsDefined per determinare se un tipo di enumerazione contiene un membro enumerazione con il determinato valore associato.

Per qualsiasi tipo di enumerazione, esistono rispettivamente conversioni boxing e unboxing da e verso il tipo System.Enum.

Specifiche del linguaggio C#

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:

Vedi anche