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

Ключевое слово enum используется для объявления перечисления — отдельного типа, который состоит из набора именованных констант, называемого списком перечислителей.The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list.

Обычно лучше всего определять перечисление непосредственно в пространстве имен, чтобы всем классам в пространстве имен было одинаково удобно обращаться к нему.Usually it is best to define an enum directly within a namespace so that all classes in the namespace can access it with equal convenience. Однако перечисление также может быть вложенным в классе или структуре.However, an enum can also be nested within a class or struct.

По умолчанию первый перечислитель имеет значение 0, и значение каждого последующего перечислителя увеличивается на 1.By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1. Например, в следующем перечислении Sat0, Sun1, Mon2и т. д.For example, in the following enumeration, Sat is 0, Sun is 1, Mon is 2, and so forth.

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

Перечисления могут использовать инициализаторы для переопределения значений по умолчанию, как показано в следующем примере.Enumerators can use initializers to override the default values, as shown in the following example.

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

В этом перечислении последовательность элементов принудительно начинается с 1 вместо 0.In this enumeration, the sequence of elements is forced to start from 1 instead of 0. Тем не менее рекомендуется включать константу, которая имеет значение "0".However, including a constant that has the value of 0 is recommended. Дополнительные сведения см. в разделе Типы перечислений.For more information, see Enumeration Types.

Каждый тип перечисления имеет базовый тип, который может быть любым целочисленным типом за исключением char.Every enumeration type has an underlying type, which can be any integral type except char. Базовым типом перечисления элементов по умолчанию является int. Чтобы объявить перечисление другого целого типа, например byte, используется двоеточие после идентификатора, за которым следует тип, как показано в следующем примере.The default underlying type of enumeration elements is int. To declare an enum of another integral type, such as byte, use a colon after the identifier followed by the type, as shown in the following example.

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

Утвержденные типы для перечисления: byte, sbyte, short, ushort, int, uint, long и ulong.The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

Переменной типа "перечисление" может быть присвоено любое значение в диапазоне базового типа. Эти значения не ограничиваются именованными константами.A variable of an enumeration type can be assigned any value in the range of the underlying type; the values are not limited to the named constants.

Значение по умолчанию enum E является значением, полученным с помощью выражения (E)0.The default value of an enum E is the value produced by the expression (E)0.

Примечание

Перечислитель не может содержать пробелы в имени.An enumerator cannot contain white space in its name.

Базовый тип указывает, какой объем хранилища выделяется для каждого перечислителя.The underlying type specifies how much storage is allocated for each enumerator. Тем не менее необходимо явное приведение, чтобы преобразовывать из типа enum в целочисленный тип.However, an explicit cast is necessary to convert from enum type to an integral type. Например, следующий оператор назначает перечислитель Sun для переменной типа int с помощью приведения, чтобы преобразовать enum в int.For example, the following statement assigns the enumerator Sun to a variable of the type int by using a cast to convert from enum to int.

int x = (int)Day.Sun;

При применении System.FlagsAttribute к перечислению, содержащему элементы, которые могут быть объединены с помощью побитовой операции OR , атрибут влияет на поведение enum при использовании с некоторыми средствами.When you apply System.FlagsAttribute to an enumeration that contains elements that can be combined with a bitwise OR operation, the attribute affects the behavior of the enum when it is used with some tools. Эти изменения можно заметить при использовании таких средств, как методы класса Console и вычислитель выражений.You can notice these changes when you use tools such as the Console class methods and the Expression Evaluator. (См. третий пример.)(See the third example.)

ОтказоустойчивостьRobust programming

Как и в случае с любой другой константой, все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции.Just as with any constant, all references to the individual values of an enum are converted to numeric literals at compile time. Это может создать потенциальные проблемы с управлением версиями, как описано в разделе Константы.This can create potential versioning issues as described in Constants.

Назначение дополнительных значений для новых версий перечислений или изменение значений элементов перечислений в новой версии может вызвать проблемы в зависимом исходном коде.Assigning additional values to new versions of enums, or changing the values of the enum members in a new version, can cause problems for dependent source code. Значения перечислений часто используются в инструкциях switсh .Enum values often are used in switch statements. Если были добавлены дополнительные элементы для типа enum , раздел по умолчанию инструкции switch может быть выбран неожиданным образом.If additional elements have been added to the enum type, the default section of the switch statement can be selected unexpectedly.

Если другие разработчики используют ваш код, необходимо предоставить рекомендации о том, как их код должен реагировать при добавлении новых элементов к любому типу enum .If other developers use your code, you should provide guidelines about how their code should react if new elements are added to any enum types.

ПримерExample

В следующем примере объявлено перечисление Day.In the following example, an enumeration, Day, is declared. Два перечислителя явно преобразуются в целое число и назначаются для целочисленных переменных.Two enumerators are explicitly converted to integer and assigned to integer variables.

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

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

ПримерExample

В следующем примере используется параметр базового типа для объявления enum , члены которого имеют тип long.In the following example, the base-type option is used to declare an enum whose members are of type long. Обратите внимание, что, даже если базовый тип перечисления является long, члены перечисления по-прежнему должны быть явно преобразованы в тип long с помощью приведения.Notice that even though the underlying type of the enumeration is long, the enumeration members still must be explicitly converted to type long by using a cast.

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
*/

ПримерExample

В следующем примере кода показано использование и влияние атрибута System.FlagsAttribute на объявление enum .The following code example illustrates the use and effect of the System.FlagsAttribute attribute on an enum declaration.

// 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
*/

КомментарииComments

Если удалить Flags, в примере будут показаны следующие значения.If you remove Flags, the example displays the following values:

5

5

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

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also