Типы перечислений (Руководство по программированию в C#)Enumeration types (C# Programming Guide)

Тип перечисления (называемый также перечислением) предоставляет эффективный способ определения набора именованных целочисленных констант, который можно назначить переменной.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. Например, предположим, что нужно определить переменную, значение которого должно представлять день недели.For example, assume that you have to define a variable whose value will represent a day of the week. Имеется только семь имеющих смысл значений, которые может принимать переменная.There are only seven meaningful values which that variable will ever store. Для определения этих значений можно использовать тип перечисления, который объявлен с помощью ключевого слова enum.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Month : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

По умолчанию базовым типом каждого элемента перечисления является int. Можно задать другой целочисленный тип, используя двоеточие, как показано в предыдущем примере.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. Полный список возможных типов см. в разделе enum (справочник по C#).For a full list of possible types, see enum (C# Reference).

Чтобы проверить основные числовые значения путем приведения в базовый тип, как показано в следующем примере.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

Day today = Day.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);

Month thisMonth = Month.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);

// Output:
// Monday is day number #1.
// Dec is month number #11.

Далее указаны преимущества использования enum вместо числового типа.The following are advantages of using an enum instead of a numeric type:

  • Для клиентского кода ясно задается, какие значения допустимы для переменной.You clearly specify for client code which values are valid for the variable.

  • В Visual Studio IntelliSense выводит список определенных значений.In Visual Studio, IntelliSense lists the defined values.

Если не указать значения этих элементов в списке перечислителя, значения будут автоматически увеличиваться на 1.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. В предыдущем примере Day.Sunday имеет значение 0, Day.Monday имеет значение 1 и т. д.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Когда создается новый объект Day, он будет иметь значение по умолчанию Day.Sunday (0), только ему явно не присвоить значение.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. При создании перечисления выберите наиболее логичное используемое по умолчанию значение и присвойте ему значение нуль.When you create an enum, select the most logical default value and give it a value of zero. В результате этого все перечисления, если при их создании им явно не задать значение, будут иметь по умолчанию это значение.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Если переменная meetingDay имеет тип Day, ей можно (без явного приведения) присвоить только одно из значений, определенных в Day.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. И если день встречи изменяется, можно назначить новое значение из Day переменной meetingDay:And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

Примечание

Переменной meetingDay можно присвоить любое произвольное целое значение.It's possible to assign any arbitrary integer value to meetingDay. Например, эта строка кода не создает ошибку: meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. Но этого делать нельзя, поскольку неявно ожидается, что переменная перечисления принимает одно из значений, определяемых перечислением.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. Присвоение переменной типа перечисления произвольного значения связано с большим риском возникновения ошибок.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Элементам списка перечислителя типа перечисления можно присвоить любые значения, и можно также использовать вычисленные значения:You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

Типы перечислений как битовые флагиEnumeration types as bit flags

Тип перечисления можно использовать для определения битовых флагов, благодаря чему экземпляр типа перечисления может хранить любую комбинацию значений, определенных в списке перечислителя.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (Конечно, некоторые комбинации могут не иметь смысла или быть недопустимы в коде программы.)(Of course, some combinations may not be meaningful or allowed in your program code.)

Чтобы создать перечисление битовых флагов, нужно применить атрибут System.FlagsAttribute и определить значения так, чтобы для них могли выполняться битовые операции AND, OR, NOT и XOR.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. В перечисление битовых флагов включите именованную константу с нулевым значением, что означает "флаги не установлены".In a bit flags enum, include a named constant with a value of zero that means "no flags are set." Не придавайте флагу нулевое значение, если оно не означает "флаги не установлены".Do not give a flag a value of zero if it does not mean "no flags are set".

В следующем примере определена другая версия перечисления Day, которая называется Days.In the following example, another version of the Day enum, which is named Days, is defined. У Days имеется атрибут Flags, и каждому значению присваивается следующая степень числа 2.Days has the Flags attribute, and each value is assigned the next greater power of 2. Это позволяет создать переменную Days со значением Days.Tuesday | Days.Thursday.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

[Flags]
enum Days
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days meetingDays = Days.Tuesday | Days.Thursday;
}

Чтобы установить флаг на перечислении, используйте побитовый оператор OR, как показано в следующем примере:To set a flag on an enum, use the bitwise OR operator as shown in the following example:

// Initialize with two flags using bitwise OR.
meetingDays = Days.Tuesday | Days.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Чтобы определить, установлен ли конкретный флаг, используйте побитовый оператор AND, как показано в следующем примере:To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days.Thursday) == Days.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Дополнительные сведения о том, что необходимо учитывать при определении типов перечислений при помощи атрибута System.FlagsAttribute, см. в статье System.Enum.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Использование методов System.Enum для получения и обработки значений перечисленияUsing the System.Enum methods to discover and manipulate enum values

Все перечисления являются экземплярами типа System.Enum.All enums are instances of the System.Enum type. Нельзя унаследовать новые классы от класса System.Enum, но можно использовать его методы для получения и изменения данных об экземпляре перечисления.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

string s = Enum.GetName(typeof(Day), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Day Enum are:");
foreach (int i in Enum.GetValues(typeof(Day)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Day Enum are:");
foreach (string str in Enum.GetNames(typeof(Day)))
    Console.WriteLine(str);

Для получения дополнительной информации см. System.Enum.For more information, see System.Enum.

Можно также создать для перечисления новый метод, используя метод расширения.You can also create a new method for an enum by using an extension method. Дополнительные сведения см. в разделе Как Создание нового метода для перечисления.For more information, see How to: Create a New Method for an Enumeration.

См. такжеSee also