Condividi tramite


Enumerazioni nel sistema di tipi comuni

Aggiornamento: novembre 2007

Un'enumerazione (enum) è un formato particolare di tipo di valore che eredita da System.Enum e consente di fornire nomi alternativi per i valori di un tipo primitivo sottostante. Un tipo di enumerazione dispone di un nome, di un tipo sottostante e di un insieme di campi. Il tipo sottostante deve essere un tipo integer incorporato con o senza segno, quale Byte, Int32 o UInt64. I campi sono campi letterali statici, ognuno dei quali rappresenta una costante. Lo stesso valore può essere assegnato a più campi. Quando questo si verifica è necessario contrassegnare uno dei valori come valore di enumerazione principale a scopo di reflection e conversione delle stringhe.

È possibile assegnare a un'enumerazione un valore del tipo sottostante e viceversa. In runtime non è richiesto alcun cast. È possibile creare un'istanza di un'enumerazione e chiamare i metodi di System.Enum, così come qualsiasi metodo definito sul tipo sottostante dell'enumerazione. In alcuni linguaggi, tuttavia, potrebbe non essere consentire passare un'enumerazione come parametro quando un'istanza del tipo sottostante è obbligatoria (o viceversa).

Alle enumerazioni si applicano le seguenti ulteriori restrizioni:

  • La definizione dei metodi non può essere eseguita direttamente dall'enumerazione.

  • Con un'enumerazione non è possibile implementare un'interfaccia.

  • Con un'enumerazione non è possibile definire proprietà o eventi.

  • Un'enumerazione non può essere generica, a meno che tale caratteristica non dipenda dal fatto che viene nidificata all'interno di un tipo generico. In altre parole, non può disporre di parametri dei tipi propri.

    Nota:

    I tipi nidificati, tra cui le enumerazioni, creati con Visual Basic, C# e C++ includono i parametri di tutti i tipi generici e sono pertanto generici anche se non dispongono di parametri dei tipi propri. Per ulteriori informazioni, vedere la sezione "Tipi nidificati" in MakeGenericType.

    È possibile dichiarare un'enumerazione generica nel linguaggio assembly Microsoft Intermediate Language (MSIL), ma si verifica una TypeLoadException se è stato effettuato un tentativo di utilizzare l'enumerazione.

L'attributo Flags indica un tipo particolare di enumerazione, detta campo di bit. In runtime non si fa distinzione tra enumerazioni tradizionali e campi di bit, ma è possibile che tale distinzione esista nel linguaggio utilizzato. Quando tale distinzione viene effettuata, gli operatori bit per bit possono essere utilizzati sui campi di bit, ma non sulle enumerazioni, per generare valori non denominati. Le enumerazioni sono in genere utilizzate per elenchi di elementi univoci, come giorni della settimana o nomi di paesi o province. I campi di bit sono normalmente utilizzati per elenchi di qualità o quantità che possono ricorrere in combinazioni, come Red And Big And Fast.

Nell'esempio che segue viene illustrato come utilizzare sia i campi di bit, sia le enumerazioni tradizionali.

Imports System
Imports System.Collections

' A traditional enumeration of some root vegetables.
Public Enum SomeRootVegetables
    HorseRadish
    Radish
    Turnip
End Enum 'SomeRootVegetables

' A bit field or flag enumeration of harvesting seasons.
<Flags()> Public Enum Seasons
   None = 0
   Summer = 1
   Autumn = 2
   Winter = 4
   Spring = 8
   All = Summer Or Autumn Or Winter Or Spring
End Enum 'Seasons

' Entry point.
Public Class EnumerationSample
    
    Public Shared Sub Main()
        ' Hash table of when vegetables are available.
        Dim AvailableIn As New Hashtable()
        
        AvailableIn(SomeRootVegetables.HorseRadish) = Seasons.All
        AvailableIn(SomeRootVegetables.Radish) = Seasons.Spring
        AvailableIn(SomeRootVegetables.Turnip) = Seasons.Spring Or _
            Seasons.Autumn
        
        ' Array of the seasons, using the enumeration.
        Dim MySeasons() As Seasons = {Seasons.Summer, Seasons.Autumn, _
            Seasons.Winter, Seasons.Spring}
        
        ' Print information of what vegetables are available each season.
        Dim i As Integer
        For i = 0 To MySeasons.Length - 1
            Console.WriteLine( _
                "The following root vegetables are harvested in " _
                & MySeasons(i).ToString("G") & ":")
            Dim e As DictionaryEntry
            For Each e In AvailableIn
                ' A bitwise comparison.
                If(CType(e.Value, Seasons) And MySeasons(i)) > 0 Then
                    Console.WriteLine("  " & _
                        CType(e.Key, SomeRootVegetables).ToString("G"))
                End If
            Next e
        Next i
    End Sub 'Main
End Class 'EnumerationSample
using System;
using System.Collections;

// A traditional enumeration of some root vegetables.
public enum SomeRootVegetables
{
    HorseRadish,
    Radish,
    Turnip
}

// A bit field or flag enumeration of harvesting seasons.
[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring
}

// Entry point.
public class EnumerationSample
{
    public static void Main()
    {
        // Hash table of when vegetables are available.
        Hashtable AvailableIn = new Hashtable();

        AvailableIn[SomeRootVegetables.HorseRadish] = Seasons.All;
        AvailableIn[SomeRootVegetables.Radish] = Seasons.Spring;
        AvailableIn[SomeRootVegetables.Turnip] = Seasons.Spring | 
            Seasons.Autumn;

        // Array of the seasons, using the enumeration.
        Seasons[] seasons = new Seasons[] { Seasons.Winter, Seasons.Spring, 
            Seasons.Summer, Seasons.Autumn };

        // Print information of what vegetables are available each season.
        for (int i = 0; i < seasons.Length; i++)
        {
            Console.WriteLine(
                "The following root vegetables are harvested in "
                + seasons[i].ToString("G") + ":");
            foreach (DictionaryEntry e in AvailableIn)
            {
                // A bitwise comparison.
                if (((Seasons)e.Value & seasons[i]) > 0)
                    Console.WriteLine("  " +
                        ((SomeRootVegetables)e.Key).ToString("G"));
            }
        }
    }
}

L'output del programma è il seguente:

The following root vegetables are harvested in Summer:
  HorseRadish
The following root vegetables are harvested in Autumn:
  Turnip
  HorseRadish
The following root vegetables are harvested in Winter:
  HorseRadish
The following root vegetables are harvested in Spring:
  Turnip
  Radish
  HorseRadish

Vedere anche

Concetti

Tipi di valore nel sistema di tipi comuni

Cenni preliminari sulla libreria di classi .NET Framework

Riferimenti

System.ValueType

System.Enum

Altre risorse

Sistema di tipi comuni