emum (Справочник по C#)

Ключевое слово enum используется для объявления перечисления, отдельного типа, состоящего из набора именованных констант, который называется списком перечислителя.

Обычно лучше всего определять перечисление прямо в пространстве имен, чтобы всем классам в пространстве имен было одинаково удобно получить к нему доступ. Однако перечисление также может быть вложено в классе или структуре.

По умолчанию первому перечислителю задано значение 0, а значение каждого последующего оператора увеличивается на 1. Например, в следующем перечислении Sat — это 0, Sun — 1, Mon — 2 и т. д.

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Перечислители могут использовать инициализаторы для переопределения значений по умолчанию, как показано в следующем примере.

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

В этом перечислении последовательность элементов принудительно начинается с 1, а не с 0. Однако рекомендуется включить константу, значение которой равно нулю. Дополнительные сведения см. в разделе Типы перечислений (Руководство по программированию в C#).

Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, исключая char. По умолчанию базовым типом элементов перечисления является int. Для объявления перечисления другого целочисленного типа, такого как байт, поставьте двоеточие после идентификатора, за которым следует тип, как показано в следующем примере.

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Для перечисления утверждены следующие типы: byte, sbyte, short, ushort, int, uint, long или ulong.

Переменной типа Days может быть назначено любое значение, входящее в диапазон базового типа; значения не ограничены именованными константами.

Значением по умолчанию enum E является значение, созданное выражением (E)0.

Примечание

Имя перечислителя не может содержать пробелов.

Базовый тип указывает размер хранилища, выделенного для каждого перечислителя. Однако для преобразования из типа enum в целочисленный тип необходимо явное приведение. Например, следующий оператор назначает перечислитель Sun переменной типа int, используя приведение для преобразования enum в int.

int x = (int)Days.Sun;

При применении FlagsAttribute к перечислению, содержащему элементы, которые могут сочетаться с битовой операцией OR, этот атрибут оказывает влияние на поведение enum, когда оно используется с некоторыми инструментами. Эти изменения можно заметить при использовании таких средств, как методы класса Console и вычислитель выражений. (См. третий пример.)

Надежное программирование

Как и в случае с любой другой константой, все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции. Это создает вероятность появления проблем с управлением версиями, как описано в разделе Константы (Руководство по программированию на C#).

Назначение дополнительных значений новым версиям перечислений или изменение значений членов перечислений в новой версии может вызвать проблемы для зависимого исходного кода. Значения перечислений часто используются в операторах switch. При добавлении дополнительных элементов к типу enum может быть неожиданно выбран раздел по умолчанию оператора switch.

Если данный код будет использоваться и другими разработчиками, необходимо предоставить рекомендации относительно действия кода при добавлении новых элементов к типам enum.

Пример

В следующем примере объявляется перечисление Days. Два перечислителя явно преобразуются в целые числа и назначаются целочисленным переменным.

public class EnumTest
{
    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

В следующем примере для объявления enum, члены которого имеют тип long, используется параметр базового типа. Обратите внимание, что даже если базовый тип перечисления является long, члены перечисления по-прежнему должны быть явно преобразованы в тип long с помощью приведения.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

В следующем примере кода показано использование атрибута FlagsAttribute в объявлении enum.

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays 
        // the name of each enum element that corresponds to a flag that has 
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Комментарии

Если убрать Flags, пример отображает следующие значения:

5

5

Спецификация языка C#

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Ключевые слова C#

Таблица целых типов (Справочник по C#)

Таблица встроенных типов (Справочник по C#)

Таблица неявных числовых преобразований (Справочник по C#)

Таблица явных числовых преобразований (Справочник по C#)

Основные понятия

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

Другие ресурсы

Справочник по C#