Перечисления в системе общих типов CTS
Обновлен: Ноябрь 2007
Перечисление (enum) является особым типом значений, который наследуется от System.Enum и предоставляет альтернативные имена для значений базового простого типа. Тип перечисления имеет имя, базовый тип и набор полей. Базовый тип должен быть одним из встроенных целочисленных типов со знаком или без (например, Byte, Int32 или UInt64). Поля являются статическими полями литералов, каждое из которых представляет константу. Одно значение можно присвоить нескольким полям. При этом необходимо отметить одно значение как первичное значение перечисления для отражения и преобразования строк.
Значение базового типа можно присвоить перечислению и наоборот (среда выполнения не требует приведения типов). Можно создать экземпляр перечисления и вызывать методы System.Enum, а также любые методы, определенные в базовом типе перечисления. Однако в некоторых языках передача перечисления в качестве параметра может не допускаться, когда требуется экземпляр базового типа, или наоборот.
К перечислениям применяются следующие дополнительные ограничения.
В них нельзя определять собственные методы.
В них нельзя реализовывать интерфейсы.
В них нельзя определять свойства и события.
Перечисление может быть универсальным, только если оно является универсальным, поскольку вложено в универсальный тип. То есть перечисления не могут иметь свои собственные параметры типов.
Примечание. Вложенные типы (включая перечисления), созданные в Visual Basic, C# и C++, включают параметры типов всех включающих их общих типов и, таким образом, являются универсальными даже в том случае, если они не имеют своих собственных параметров типов. Дополнительные сведения см. в разделе "Вложенные типы" в MakeGenericType.
Можно объявить универсальное перечисление на языке MSIL, но при попытке использовать это перечисление возникает TypeLoadException.
Атрибут Флаги обозначает специальный вид перечисления, называемый битовым полем. Среда выполнения (в отличие от языка программирования) не различает обычные перечисления и битовые поля. Если это отличие обнаружено, для создания неименованных значений в битовых полях можно использовать битовые операторы (в перечислениях их использовать нельзя). Перечисления обычно используются для списков уникальных элементов, например дней недели, названий стран или областей и т. д. Битовые поля обычно используются для списков количеств и качеств, которые могут возникать в таких комбинациях, как Red And Big And Fast.
В следующем примере показан способ использования битовых полей и обычных перечислений.
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"));
}
}
}
}
Результат выполнения этой программы выглядит следующим образом.
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
См. также
Основные понятия
Типы значений в системе общих типов CTS
Общие сведения о библиотеке классов .NET Framework