Speak.Me Учить иностранные слова

C#: перечислимые типы (enum)

Перечисление (enumeration) — это множество именованных целочисленных констант. Перечисляемые типы относятся к значимым типам.

Объявляются перечисляемые типы с помощью ключевого слова enum. Формат определения такой:

Имя задает имя перечисляемого типа, а список перечисления представляет собой список идентификаторов, разделенных запятыми.

Доступ к членам перечисления осуществляется с помощью имени перечисляемого типа и оператора точка.

Каждый член перечисления указывает на целочисленное значение. По умолчанию эти значения имеют тип int и членам перечисления присваиваются константы 0, 1, 2, … (т.е. целые числа начиная с нуля). Однако для членов перечисления можно задать и другой целочисленный тип:

Также можно явно задать целочисленные значения для каждого члена:

Можно задать только некоторые члены перечисления, при этом члены, которым не заданы значения, будут увеличиваться на один с последнего заданного члена:

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

  • как тип enum
  • как лежащее в основе целочисленное значение
  • как строку

Значения перечислений могут преобразовываться между этими типами.

Приведение перечислений

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

Также можно явно приводить один тип перечисления к другому, при этом преобразование осуществляется через целочисленные значения перечисления.

Литерал 0 обрабатывается особо: он не требует явного приведения:

Экземпляру перечисления можно присвоить значение, которое выходит за пределы значений его членов:

Битовые флаги (Flags Enums)

Члены перечислений можно комбинировать (объединять). Чтобы избежать неоднозначности членам комбинируемых перечислений необходимо явно присваивать значения.

Комбинировать значения перечислений можно с помощью побитовых операторов, таких как | и &.

По соглашению комбинированным членам перечисления дается множественное имя, например leftRight.

Комбинированным перечислениям следует присваивать атрибут Flags. Если этого не сделать метод ToString будет возвращать числовые значения, а не последовательность имен. Перечисления с атрибутом flags называются битовыми флагами.

Сочетания членов можно указывать внутри самих перечисляемых типов:

Операторы перечислений

С перечислениями можно использовать следующие операторы:

= == != < > <= >= + - ^ & | ~
+= -= ++ - sizeof

При этом перечисления воспринимаются как целочисленные значения. Сложение возможно только между типом enum и целочисленным типом, но не между двумя перечислениями.

System.Enum

Класс System.Enum предоставляет расширенную поддержку типов enum, обеспечивая унификацию и определяя статические служебные методы. Унификация типов enum подразумевает возможность неявного приведения любого члена перечисления к типу System.Enum. Статические методы дают возможность выполнения преобразований и получения списка членов.

Статический метод Enum.GetUnderlyingType возвращает лежащий в основе перечисления целочисленный тип:

Статический метод Enum.ToObject преобразует целочисленное значение в экземпляр enum указанного типа:

Преобразовать enum в строку можно с помощью статического метода Enum.Format либо с помощью экземплярного метода ToString. Оба метода принимают форматную строку.

Метод Enum.Parse преобразует строку в enum. Он принимает тип enum и строку, которая может включать множество членов. Необязательный третий аргумент позволяет выполнить разбор не чувствительный к регистру. Если член не найден генерируется исключение ArgumentException.

Метод Enum.GetValues возвращает массив, содержащий все члены указанного типа enum:

Метод Enum.GetNames делает тоже самое, но возвращает массив строк.

Форматные строки для перечислений

Для перечислений предусмотрены следующие форматные строки:

  • G или g — общий формат применяемый по умолчанию
  • F или f — рассматривает экземпляр enum как флаг, позволяя коректно преобразовывать составные члены
  • D или d — десятичное значение, извлекает лежащее в основе целочисленное значение и представляет его в виде строки
  • X или x — шестнадцатеричное значение, извлекает лежащее в основе целочисленное значение и представляет его в виде шестнадцатеричной записи