Énumérations dans le système de type commun
Mise à jour : novembre 2007
Une énumération (enum) est une forme spéciale de type valeur, qui hérite de System.Enum et fournit des noms de remplacement pour les valeurs d'un type primitif sous-jacent. Un type énumération a un nom, un type sous-jacent et un ensemble de champs. Le type sous-jacent doit être l'un des types d'entier signés ou non signés intégrés (tels que Byte, Int32 ou UInt64). Les champs sont des champs statiques de type Literal, chacun représentant une constante. La même valeur peut être assignée à plusieurs champs. Dans ce cas, vous devez marquer l'une des valeurs comme valeur d'énumération primaire à des fins de réflexion et de conversion de chaîne.
Vous pouvez assigner une valeur du type sous-jacent à une énumération et vice-versa (aucun cast n'est requis par le runtime). Vous pouvez créer une instance d'une énumération et appeler les méthodes de System.Enum, ainsi que toute méthode définie sur le type sous-jacent de l'énumération. Cependant, certains langages pourraient ne pas vous permettre de passer une énumération comme paramètre lorsqu'une instance du type sous-jacent est requise (ou vice-versa).
Les restrictions supplémentaires suivantes s'appliquent aux énumérations :
Elles ne peuvent pas définir leurs propres méthodes.
Elles ne peuvent pas implémenter d'interfaces.
Elles ne peuvent pas définir des propriétés ou des événements.
Une énumération ne peut pas être générique, à moins qu'elle le soit uniquement parce qu'elle est imbriquée dans un type générique. Par conséquent, une énumération ne peut pas avoir de paramètres de type propres.
Remarque : Les types imbriqués (y compris les énumérations) créés avec Visual Basic, C# et C++ incluent les paramètres de type de tous les types génériques englobants et sont donc génériques, même s'ils n'ont pas de paramètres de type propres. Pour plus d'informations, consultez « Types imbriqués » dans MakeGenericType.
Il est possible de déclarer une énumération générique en langage assembleur MSIL (Microsoft Intermediate Language), mais une TypeLoadException se produit si une tentative est faite pour utiliser l'énumération.
L'attribut Flags désigne un genre particulier d'énumération qualifié de champ de bits. Le runtime lui-même ne fait pas de distinction entre les énumérations traditionnelles et les champs de bits, mais votre langage pourrait le faire. Lorsque cette distinction est effectuée, les opérateurs binaires peuvent être utilisés sur les champs de bits, mais pas sur les énumérations, pour générer des valeurs sans nom. Les énumérations sont généralement utilisées pour des listes d'éléments uniques, tels que les jours de la semaine, des noms de pays ou de région, etc. Les champs de bits sont généralement utilisés pour des listes de qualités ou de quantités pouvant être utilisées en combinaison, telle que Red And Big And Fast.
L'exemple suivant montre comment utiliser les champs de bits et les énumérations traditionnelles.
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"));
}
}
}
}
La sortie de ce programme est présentée ci-dessous.
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
Voir aussi
Concepts
Types valeur du système de type commun
Vue d'ensemble de la bibliothèque de classes du .NET Framework