Enum class c что это
Типы перечислений (справочник по C#)
Тип перечисления (или тип enum) — это тип значения, определенный набором именованных констант применяемого целочисленного типа. Чтобы определить тип перечисления, используйте ключевое слово enum и укажите имена элементов перечисления:
Вы не можете определить метод внутри определения типа перечисления. Чтобы добавить функциональные возможности к типу перечисления, создайте метод расширения.
Тип перечисления используется для представления выбора из набора взаимоисключающих значений или комбинации вариантов выбора. Чтобы представить комбинацию вариантов выбора, определите тип перечисления как битовые флаги.
Типы перечислений как битовые флаги
Дополнительные сведения и примеры см. на странице справочника по API System.FlagsAttribute и в разделе о неисключительных элементах и атрибутах Flags страницы справочника по API System.Enum.
Тип System.Enum и ограничение перечисления
Тип System.Enum является абстрактным базовым классом всех типов перечисления. Он предоставляет различные методы, позволяющие получить информацию о типе перечисления и его значениях. Дополнительные сведения и примеры см. на странице справочника по API System.Enum.
Преобразования
Для любого типа перечисления существуют явные преобразования между типом перечисления и его базовым целочисленным типом. Если вы привели значение перечисления к его базовому типу, то результатом будет связанное целочисленное значение элемента перечисления.
Используйте метод Enum.IsDefined, чтобы определить, содержит ли тип перечисления элемент перечисления с определенным связанным значением.
Для любого типа перечисления существует упаковка — преобразование и распаковка — преобразование в тип System.Enum и из него соответственно.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
Перечисления в C#: как правильно использовать enum
В C# есть много крутых инструментов, которые позволяют улучшить любой код. Один из них — enum. Давайте разберёмся, что это и как с ним работать.
Списки перечисления (или enum) сокращают код и улучшают его читаемость. В этой статье мы создадим enum и научимся применять его эффективно.
Что такое enum в C#
Это список однотипных значений: цветов, состояний, способов выравнивания и так далее. Например, в C# существует встроенный список цветов:
То есть нам не нужно вручную вводить код цвета — вместо этого мы просто выбираем значение из заранее составленного списка.
В самом enum тоже не хранится код цвета. Цифра 9 на примере выше — это индекс элемента в списке. Логика изменения цвета в нашем случае примерно такая:
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Как создать enum в C#
Создайте отдельный файл и назовите его так, чтобы понять, какой это список. Например, Direction.cs:
После объявления нового enum он используется как тип данных:
Вы можете указать и какие-то собственные значения для элементов. Например, коды ответа веб-сервера:
По умолчанию тип значения — int, но он изменяется на любой другой целочисленный тип:
Как использовать enum в C#
Самый простой пример — конструкции if и switch.
Вот результат работы такой программы:
Также вы можете использовать enum вместе с полиморфизмом.
Таким образом вы получите код, который очень быстро читается. И теперь не нужно думать, какой метод использовать, — благодаря полиморфизму всё выглядит почти как человеческая речь: set item type — Food (указать тип предмета — Еда).
Другая хорошая практика — использовать enum в качестве возвращаемого типа для методов, в которых ошибка может произойти по разным причинам. Например, отправка данных на сервер.
Этот метод возвращает три сообщения в зависимости от ситуации:
Конечно, допустимо куда больше вариантов: от ошибки базы данных до превышения времени ожидания.
Как enum помогает улучшить читаемость
Представим, что у нас есть класс Item со следующими полями:
Все эти значения передаются объекту через конструктор, поэтому инициализация выглядит так:
Без enum со временем вы забудете, за что отвечает третий аргумент, и вам придётся каждый раз проверять реализацию класса, чтобы освежить память. Или вы добавите новые типы предметов, из-за чего таких аргументов ( isArmor, isPotion) станет ещё больше:
Избежать таких неприятных моментов как раз и помогает enum: создайте перечисление ItemType и передавайте в конструктор его.
С первого взгляда понятно, что здесь имеется в виду.
Класс Enum (C++/CLI и C++/CX)
Объявляет перечисление в области видимости пространства имен, которое является определяемым пользователем типом, состоящим из ряда именованных констант, называемых перечислителями.
Все среды выполнения
Примечания
Среда выполнения Windows
Синтаксис
Параметры
enumeration-identifier
Имя перечисления.
базовый тип
(Необязательно) Базовый тип перечисления.
Перечислитель-список
Разделенный запятыми список имен перечислителей.
Значение каждого перечислителя — константное выражение, которое или определяется неявно компилятором, или явно нотацией enumerator constant-expression. По умолчанию значение первого перечислителя ноль, если он определен неявно. Значение каждого следующего неявно определенного перечислителя — значение предыдущего перечислителя + 1.
var
(Необязательно) Имя переменной типа перечисления.
Примечания
Дополнительные сведения и примеры см. в разделе Перечисления.
Обратите внимание, что компилятор выводит сообщения об ошибках, если константное выражение, задающее значение перечислителя, не может быть представлено underlying-type. Однако компилятор не сообщает об ошибке для значения, недопустимого для базового типа. Пример.
Если базовый тип является числовым, а перечислитель задает максимальное значение для этого типа, то значение следующего неявно определенного перечисления не может быть представлено.
Если underlying-type является и более двух перечислителей определены неявно, то нельзя представить перечислители после первых двух.
Если underlying-type является и значение перечисления в диапазоне от 0xD800 до 0xDFFF, то значение можно представить. Однако логически значение неверно, так как оно представляет половину пары символов-заместителей Юникода и не должно отображаться в изоляции.
Требования
Параметр компилятора: /ZW
Среда CLR
Синтаксис
Параметры
Перечислитель-список
Разделенный запятыми список идентификаторов (перечислителей) в перечислении.
name
Имя перечисления. Анонимные управляемые перечисления не допускаются.
var
(Необязательно) Имя переменной типа перечисления.
Примечания
enum class и enum struct являются эквивалентными объявлениями.
Существуют два типа перечислений: управляемые (C++/CX) и стандартные.
Управляемые перечисления (или перечисления C++/CX) могут быть определены следующим образом:
Это семантически эквивалентно:
Стандартное перечисление может быть определено следующим образом:
Это семантически эквивалентно:
Управляемые имена перечислителей (identifiers) не вводятся в область, в которой определяется перечисление; все ссылки на перечислители должны быть полными (имя идентификатор). По этой причине нельзя определить анонимное управляемое перечисление.
Перечислители стандартного перечисления строго вводятся во внешнюю область. То есть, если есть другой символ с таким же именем, как у перечислителя во внешней области видимости, компилятор выдаст ошибку.
В Visual Studio 2002 и Visual Studio 2003 перечислители были нестрого вводимыми (видимыми во внешней области, если не было другого идентификатора с таким же именем).
Если определено стандартное перечисление C++ (без class или struct ), компиляция с помощью /clr приведет к компиляции перечисления в качестве управляемого перечисления. Перечисление по-прежнему имеет семантику неуправляемого перечисления. Обратите внимание, что компилятор вводит атрибут Microsoft::VisualC::NativeEnumAttribute для определения намерения программиста сделать перечисление собственным. Другие компиляторы просто увидят стандартное перечисление как управляемое перечисление.
В Visual Studio 2002 и Visual Studio 2003 стандартное перечисление используется в качестве типа в параметре функции.
Этот код выдал бы в MSIL для сигнатуры функции следующее:
Однако в текущих версиях компилятора стандартное перечисление выдается как управляемое перечисление с [NativeEnumAttribute], а в MSIL для сигнатуры функции выдается следующее:
Дополнительные сведения о неуправляемых перечислителях см. в разделе Объявление перечислений C++.
Дополнительные сведения о перечислителях CLR см. в следующем разделе:
Перечисления (C++)
Перечисление — это пользовательский тип, состоящий из набора целочисленных констант, называемых перечислителями.
В этой статье рассматривается тип языка C++ Standard в формате ISO enum и тип enum с областью действия (или строго типизированный), который появился в C++ 11. Сведения об открытых классах enum или закрытых типах классов enum в c++/CLI и c++/CX см. в разделе Класс Enum.
Синтаксис
Параметры
identifier
Имя типа, присваиваемое перечислению.
type
Базовый тип перечислителей; все перечислители имеют один базовый тип. Может быть любым целочисленным типом.
Область перечислителя
Перечисление предоставляет контекст для описания диапазона значений, которые представлены в виде именованных констант и также называются перечислителями. В первоначальных типах перечислений C и C++ перечислители с неполным имеем являются видимыми внутри области видимости, в которой объявлено перечисление. В ограниченных перечислениях имя перечислителя должно уточняться именем типа перечисления. В следующем примере демонстрируется основное различие между двумя видами перечислений.
Каждому имени в перечислении присваивается целочисленное значение, которое соответствует определенному месту в порядке значений в перечислении. По умолчанию первому значению присваивается 0, следующему — 1 и т. д., но можно задать значение перечислителя явным образом, как показано ниже:
Каждый перечислитель рассматривается как константа и должен иметь уникальное имя в пределах области, где enum определено (для перечислений с неограниченным диапазоном) или внутри enum самого себя (для перечислений с областью видимости). Значения, задаваемые имена, могут быть неуникальными. Например, для следующего объявления неограниченного перечисления Suit :
Приведение правил
Неограниченные константы перечисления могут быть неявно преобразованы в, но никогда не может быть неявно преобразовано int int в значение enum. В следующем примере показано, что пройдет при попытке присвоить переменной hand значение, не относящееся к типу Suit :
Для преобразования int в перечислитель с областью или вне области действия требуется приведение. Однако неограниченный перечислитель можно преобразовать в целочисленное значение без приведения.
Использование подобных неявных преобразований может приводить к непредвиденным побочным эффектам. Чтобы избежать ошибок программирования, связанных с неограниченными перечислениями, значения ограниченных перечислений являются строго типизированными. Ограниченные перечислители должны уточняться именем типа перечисления (идентификатором); они не могут быть неявно преобразованы, как показано в следующем примере:
Обратите внимание, что в строке hand = account_num; по-прежнему содержится ошибка, которая происходит при использовании неограниченных перечислений, как показано выше. Эта ошибка устраняется с помощью явного приведения. Однако при использовании ограниченных перечислений попытка преобразования в следующем операторе — account_num = Suit::Hearts; — больше не будет разрешена без явного приведения.
Перечисления без перечислителей
Visual Studio 2017 версии 15,3 и более поздних версий (доступно в и более поздних версиях): путем определения перечисления (regular или с ограниченной областью) с явным базовым типом и без перечислителей, вы можете использовать новый целочисленный тип, который не имеет неявного преобразования в любой другой тип. Используя этот тип вместо встроенного базового типа, можно исключить потенциальные ошибки для незначительных ошибок, вызванных случайными неявными преобразованиями.
Новый тип является точной копией базового типа и, таким образом, имеет то же соглашение о вызовах, что означает, что его можно использовать в ABI без снижения производительности. Если переменные типа инициализируются с помощью инициализации прямого списка, приведение не требуется. В следующем примере показано, как инициализировать перечисления без перечислителей в различных контекстах:
BestProg
Содержание
Поиск на других ресурсах:
1. Общие сведения о перечислениях. Преимущества использования перечислений в программах
Тип данных «перечисление» используется для создания именованных идентификаторов, представляющих некоторое целочисленное константное значение.
Перечисления позволяют объединять группы константных значений в единое целое. Формируется тип перечисления на основании которого может быть объявлена переменная, которая принимает значение из набора, который описывается в перечислении.
При использовании перечислений в программах можно выделить следующие взаимосвязанные преимущества:
Общая форма объявления перечисления следующая:
Если значение константы в перечислении не задано, то оно принимает значение, которое есть на 1 больше чем предыдущее константное значение. Например, если предыдущая константа имела значение 5, то следующая будет иметь значение 6. В случае типа char следующая константа есть следующим символом в таблице символов.
После объявления типа (шаблона) перечисления, можно объявлять переменные этого типа, например
Если объявлена переменная, то эта переменная в программе может принимать значение имени из перечисления, например
3. Каким образом в перечислении можно задать значение перечислительным константам? Пример
Значение перечислительным константам можно задать одним из двух способов:
Пример.
4. Константные значения каких типов данных разрешается использовать в перечислениях?
В перечислениях допускается использовать константные значения следующих типов:
компилятор выдаст сообщение об ошибке
5. Могут ли в перечислениях использоваться отрицательные значения перечислительных констант?
В перечислении VALUES используется отрицательная константа
6. Примеры объявления разных видов перечислений с различными способами начальной инициализации
Пример 1. Объявляется перечисление, реализующее месяцы года.
7. Примеры объявления и использования перечислений в программах
будет выводиться число 10. Идентификатор ‘Oct’ выводиться не будет.
8. Какая область видимости константы, объявленной в перечислении?
Константа, объявленная в перечислении, имеет область видимости в пределах скобок, в которых объявляется шаблон (тип) перечисления.
Например.
то компилятор выдаст ошибку
здесь TypeName – имя нового типа перечисления, которое создается.