Enumerações no CTS (Common Type System)
Uma enumeração (enum) é uma forma especial de tipo de valor, que herda do System.Enum e fornece nomes alternativos para os valores de um tipo primitivo subjacente.Um tipo de enumeração tem um nome, um tipo subjacente, e um conjunto de campos.O tipo subjacente deve ser um dos tipos internos, inteiro com sinal ou sem-sinal (como Byte, Int32, ou UInt64).Os campos são campos literais estáticos, cada um deles representa uma constante.O mesmo valor pode ser atribuído a vários campos.Quando isso ocorrer, você deve marcar um dos valores como o valor primário da enumeração para fins de conversão de reflexão e sequência.
Você pode atribuir um valor de tipo subjacente para uma enumeração e vice-versa (nenhuma conversão é exigida pelo runtime).Você pode criar uma instância de uma enumeração e chamar os métodos de System.Enum, assim como quaisquer métodos definidos no tipo subjacente da enumeração.No entanto, algumas linguagens talvez não permitam que você passe uma enumeração como um parâmetro quando uma instância do tipo subjacente é necessária (ou vice-versa).
As seguintes restrições adicionais se aplicam a enumerações:
Elas não podem definir seus próprios métodos.
Elas não podem implementar interfaces.
Elas não podem definir propriedades ou eventos.
Uma enumeração não pode ser genérica, a menos que seja genérica exclusivamente por estar aninhada em um tipo genérico.Ou seja, uma enumeração não pode ter parâmetros de tipo próprios.
Observação: Tipos aninhados (incluindo enumerações) criados com Visual Basic, C# e C++ incluem os parâmetros de tipo de todos os tipos genéricos delimitadores e, por consequência, são genéricos mesmo que eles não tenham parâmetros de tipo próprios.Para obter mais informações, consulte "Tipos aninhados" em MakeGenericType.
É possível declarar uma enumeração genérica em linguagem de assembly Microsoft Intermediate Language (MSIL), mas uma TypeLoadException ocorre se for feita uma tentativa para usar a enumeração.
O atributo Flags indica um tipo especial de enumeração chamado campo de bits.O próprio runtime não faz distinção entre enumerações tradicionais e campos de bits, mas a linguagem pode fazer.Quando é feita essa distinção, operadores bit a bit podem ser usados em campos de bits, mas não em enumerações, para gerar valores sem-nome.Enumerações geralmente são usadas para listas de elementos, como dias da semana, país ou região, e assim por diante.Os campos de bits são geralmente usados para listas de qualidades ou quantidades que possam ocorrer em combinação, como Red And Big And Fast.
O exemplo a seguir mostra como usar os campos bit e enumerações tradicionais.
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"));
}
}
}
}
A saída do programa é a seguinte.
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
Consulte também
Conceitos
Tipos de valores no CTS (Common Type System)
Visão geral sobre biblioteca classes do .NET Framework