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