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

Обновлен: Ноябрь 2007

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

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

По умолчанию первому перечислителю задано значение, равное нулю, а значение каждого последующего оператора увеличивается на 1. Например:

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

В этом перечислении Sat имеет значение 0, Sun — 1, Mon — 2 и т. д. Для переопределения значений по умолчанию перечисления могут иметь инициализаторы. Пример.

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

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

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

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

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

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

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

sbbt4032.alert_note(ru-ru,VS.90).gifПримечание.

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

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

int x = (int)Days.Sun;

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

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

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

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

Если данный код будет использоваться и другими разработчиками, необходимо предоставить рекомендации относительно действия кода при добавлении новых элементов к типам 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
*/

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

[Flags]
public enum CarOptions
{
    SunRoof = 0x01,
    Spoiler = 0x02,
    FogLights = 0x04,
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Комментарии

Обратите внимание, что при удалении FlagsAttribute будет получен следующий результат.

5

5

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

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

  • 1.10 Перечисления

  • 6.2.2 Явные преобразования перечислений

  • 14 Перечисления

См. также

Задачи

Пример атрибутов

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

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

Разработка перечислений

Ссылки

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

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

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

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

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

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

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