Меню

Enum c вывести имя

Перечисляемый тип

Перечисляемый тип

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

В этой программе объявлено перечисление с именем Gender. Переменная типа enum Gender может принимать теперь только два значения – это MALE И FEMALE.

По умолчанию, первое поле структуры принимает численное значение 0, следующее 1, следующее 2 и т.д. Можно задать нулевое значение явно:

Будут выведены значения 0 1 0 1 2. То есть, значение SYMBOL равно значению EXPRESSION, а NUMBER равно OPERATOR. Если мы изменим программу и напишем

То SYMBOL будет равно значению 0, NUMBER равно 1, EXPRESSION равно 10, OPERATOR равно 11, UNDEFINED равно 12.

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

Заметьте, что мы не можем присвоить переменной типа Token просто численное значение. Переменная является сущностью типа Token и принимает только значения полей перечисления. Тем не менее, переменной числу можно присвоить значение поля перечисления.

Обычно перечисления используются в качестве набора именованных констант. Часто поступают следующим образом — создают массив строк, ассоциированных с полями перечисления. Например

Так как поля принимают численные значения, то они могут использоваться в качестве индекса массива строк. Команда exit(N) должна получать код ошибки, отличный от нуля, потому что 0 — это плановое завершение без ошибки. Именно поэтому первое поле перечисления равно единице.

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

Источник

Enum. Get Name Метод

Определение

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Перегрузки

Возвращает имя константы с заданным значением из указанного перечисления.

Возвращает имя константы с заданным значением из указанного типа перечисления.

GetName(Type, Object)

Возвращает имя константы с заданным значением из указанного перечисления.

Параметры

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

Возвращаемое значение

Строка, содержащая имя константы перечислимого типа в enumType , значение которой равно value , или значение null , если такая константа не найдена.

Исключения

Параметр enumType или value имеет значение null .

Значение параметра enumType не является объектом Enum.

-или- Параметр value не принадлежит к типу enumType , и его базовым типом также не является enumType .

Примеры

В следующем примере демонстрируется применение GetName .

Комментарии

Если несколько членов перечисления имеют одинаковое базовое значение, GetName метод гарантирует, что он возвратит имя одного из этих членов перечисления. Однако он не гарантирует, что он всегда будет возвращать имя того же члена перечисления. В результате, если несколько членов перечисления имеют одинаковое значение, код приложения никогда не должен зависеть от метода, возвращающего имя определенного члена.

Источник

BestProg

Класс System.Enum . Перечисления

Данная тема взаимосвязана со следующей темой:

Содержание

Поиск на других ресурсах:

1. Класс System.Enum . Назначение. Обзор методов

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

Если объявить перечисление по образцу

то создается тип данных с именем EnumType , содержащий строго определенные константные имена constant1 , constant2 …, constantN .

Для экземпляра типа EnumType и для любого другого экземпляра, объявленного с ключевым словом enum , становятся доступными (наследуются) следующие методы базового класса System.Enum :

  • GetValues​​() — возвращает массив значений констант в указанном перечислении в виде массива типа System.Array ;
  • GetName() — возвращает одиночное значение заданной константы в заданном перечислении как строка типа string ;
  • GetNames() — возвращает массив имен констант типа string[] в указанном перечислении;
  • Parse() — конвертирует строчное представление имени или числового значения одной или нескольких констант перечисления в эквивалентный перечислимый объект.
2. Методы класса System.Enum
2.1. Метод GetName() . Получить значение константы в виде строки. Пример

Метод GetName() позволяет получить значение константы с некоторого перечисления в виде строки. Согласно документации общая форма метода следующая:

  • System.Type — абстрактный класс, представляющий типы классов, интерфейсов, массивов, значений, перечисления, параметров, обобщений;
  • enumType — тип перечисления для которого нужно получить имя значения;
  • value — значение конкретной константы из перечисления enumType .

Чтобы в метод GetName() передать тип перечисления EnumType , нужно использовать средство typeof() по образцу

При использовании метода возможны исключительные ситуации следующих типов:

  • System.ArgumentNullException — возникает, когда значение enumType или value равно null;
  • System.ArgumentException — возникает, когда значение enumType не является перечислением или значение value не является типом enumType .

Пример. В примере ниже получается название дня недели, который установлен в переменной d типа Days .

Читайте также:  Чем отстирать виски с колой с белого
2.2. Метод GetNames() . Получить массив имен констант перечисления. Пример

Метод GetNames() позволяет получить массив типа string[] , содержащий имена констант указанного перечисления. Согласно документации общая форма метода следующая:

здесь enumType – тип перечисления, для которого нужно получить строковое представление его констант.

При использовании метода могут возникнуть исключительные ситуации:

  • типа System.ArgumentNullException , если enumType равно null ;
  • типа System.ArgumentException , если enumType не является перечислением типа System.Enum .

Пример.

Результат выполнения программы

2.3. Метод GetValues() . Получить массив значений констант перечисления. Пример

Значение целочисленных или строчных констант из перечисления можно получить с помощью метода GetValues() , который имеет следующую общую форму:

  • System.Array — тип значений констант, которые возвращаются в виде динамического массива;
  • System.Type — абстрактный класс, представляющий типы классов, интерфейсов, массивов, значений, перечислений, параметров, обобщений;
  • enumType — экземпляр перечисления типа System.Type .

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

  • System.ArgumentNullException — случай, когда enumType == null ;
  • System.ArgumentException — случай, когда enumType не является перечислением;
  • System.InvalidOperationException — случай, когда метод вызван отражением в контексте «только отражение» или enumType является типом сборки, которая отображается в контексте «только отражение».

Пример. В примере с помощью методов GetValues​​() и GetNames() выводятся имена и значения констант из перечисления, описывающего количество дней в определенном времени года.

Результат выполнения программы

2.4. Метод Parse() . Конвертировать строковое представление перечисления в объект. Пример

Метод Parse() позволяет получить отдельное значение из перечисления по его имени. Метод имеет несколько перегруженных реализаций. Согласно документации общая форма некоторых реализаций метода следующая:

  • enumType — переменная типа перечисление;
  • value — строчное представление значения из перечисления, которое нужно конвертировать;
  • ignoreCase — флажок, определяющий нужно ли игнорировать регистр символов ( true ).

При использовании метода возможны исключительные ситуации следующих типов:

  • System.ArgumentNullException — случай, когда enumType = null ;
  • System.ArgumentException — генерируется в случаях, когда enumType не является типом System.Enum или value не входит в перечень констант перечисления enumType ;
  • System.OverflowException — значение есть за пределами диапазона типа enumType .

Пример. В примере описывается перечисление Corners , содержащее количество углов известной фигуры. С помощью метода Parse() демонстрируется определение количества углов шестиугольника (Hexagon). При обращении к имени фигуры в перечислении, не учитывается регистр символов.

Результат выполнения программы

3. Пример использования класса System.Enum для определения количества дней в заданном месяце

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

Источник

Перечисления в 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 в качестве возвращаемого типа для методов, в которых ошибка может произойти по разным причинам. Например, отправка данных на сервер.

Этот метод возвращает три сообщения в зависимости от ситуации:

  1. Попытка отправить пустой запрос.
  2. Успешная отправка запроса.
  3. Неизвестная ошибка.

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

Как enum помогает улучшить читаемость

Представим, что у нас есть класс Item со следующими полями:

  • id — идентификатор;
  • name — название;
  • isWeapon — булево значение, которое говорит, является ли предмет оружием.
Читайте также:  Как отмыть пластиковую дверь от пленки

Все эти значения передаются объекту через конструктор, поэтому инициализация выглядит так:

Без enum со временем вы забудете, за что отвечает третий аргумент, и вам придётся каждый раз проверять реализацию класса, чтобы освежить память. Или вы добавите новые типы предметов, из-за чего таких аргументов ( isArmor, isPotion) станет ещё больше:

Избежать таких неприятных моментов как раз и помогает enum: создайте перечисление ItemType и передавайте в конструктор его.

С первого взгляда понятно, что здесь имеется в виду.

Источник

Урок №58. Перечисления

Обновл. 4 Сен 2021 |

Язык C++ позволяет программистам создавать свои собственные (пользовательские) типы данных.

Перечисляемые типы

Перечисление (или «перечисляемый тип») — это тип данных, где любое значение (или «перечислитель») определяется как символьная константа. Объявить перечисление можно с помощью ключевого слова enum. Например:

Объявление перечислений не требует выделения памяти. Только когда переменная перечисляемого типа определена (например, как переменная paint в примере, приведенном выше), только тогда выделяется память для этой переменной.

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

Примечание: До C++11, конечная запятая после последнего перечислителя (как после COLOR_PURPLE в примере, приведенном выше) не разрешается (хотя многие компиляторы её все равно принимают). Однако начиная с C++11 конечная запятая разрешена.

Имена перечислений

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

Распространено добавление названия перечисления в качестве префикса к перечислителям, например: ANIMAL_ или COLOR_ , как для предотвращения конфликтов имен, так и в целях комментирования кода.

Значения перечислителей

Каждому перечислителю автоматически присваивается целочисленное значение в зависимости от его позиции в списке перечисления. По умолчанию, первому перечислителю присваивается целое число 0 , а каждому следующему — на единицу больше, чем предыдущему:

Результат выполнения программы:

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

Обратите внимание, ANIMAL_HORSE и ANIMAL_ZEBRA имеют одинаковые значения. Хотя C++ это не запрещает, присваивать одно значение нескольким перечислителям в одном перечислении не рекомендуется.

Совет: Не присваивайте свои значения перечислителям.

Правило: Не присваивайте одинаковые значения двум перечислителям в одном перечислении, если на это нет веской причины.

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

Поскольку значениями перечислителей являются целые числа, то их можно присваивать целочисленным переменным, а также выводить в консоль (как переменные типа int):

Результат выполнения программы:

Компилятор не будет неявно конвертировать целочисленное значение в значение перечислителя. Следующее вызовет ошибку компиляции:

Тем не менее, вы можете сделать подобное с помощью оператора static_cast:

Компилятор также не позволит вам вводить перечислители через std::cin:

Однако, вы можете ввести целое число, а затем использовать оператор static_cast, чтобы поместить целочисленное значение в перечисляемый тип:

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

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

Вывод перечислителей

Попытка вывести перечисляемое значение с помощью std::cout приведет к выводу целочисленного значения самого перечислителя (т.е. его порядкового номера). Но как вывести значение перечислителя в виде текста? Один из способов — написать функцию с использованием стейтментов if:

Выделение памяти для перечислений

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

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

Польза от перечислений

Перечисляемые типы невероятно полезны для документации кода и улучшения читабельности.

Например, функции часто возвращают целые числа обратно в caller в качестве кодов ошибок, если что-то пошло не так. Как правило, небольшие отрицательные числа используются для представления возможных кодов ошибок. Например:

Однако магические числа, как в вышеприведенном примере, не очень эффективное решение. Альтернатива — использовать перечисления:

Читайте также:  Как вывести уровень потолка одному

Это и читать легче, и понять проще. Кроме того, функция, которая вызывает другую функцию, может проверить возвращаемое значение на соответствующий перечислитель. Это лучше, нежели самому сравнивать возвращаемый результат с конкретными целочисленными значениями, чтобы понять какая именно ошибка произошла, не так ли? Например:

Перечисляемые типы лучше всего использовать при определении набора связанных идентификаторов. Например, предположим, что вы пишете игру, в которой игрок может иметь один предмет, но этот предмет может быть нескольких разных типов:

Или, если вы пишете функцию для сортировки группы значений:

Многие языки программирования используют перечисления для определения логических значений. По сути, логический тип данных — это простое перечисление всего лишь с двумя перечислителями: true и false! Однако в языке C++ значения true и false определены как ключевые слова вместо перечислителей.

Задание №1

Напишите перечисление со следующими перечислителями: ogre , goblin , skeleton , orc и troll .

Ответ №1

Задание №2

Объявите переменную перечисляемого типа, который вы определили в задании №1, и присвойте ей значение ogre .

Ответ №2

Задание №3

Правда или ложь:

присваивать целочисленные значения;

не присваивать значения;

присваивать значения предыдущих перечислителей (например, COLOR_BLUE = COLOR_GRAY ).

Перечислители могут быть:

Ответ №3

Правда. Перечислителю без значения будет неявно присвоено целочисленное значение предыдущего перечислителя +1. Если предыдущего перечислителя нет, то тогда присвоится значение 0 .

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

Перечислители могут быть:

Поделиться в социальных сетях:

Урок №57. Введение в std::string

Комментариев: 34

Тут можно как-нибудь сделать ввод буквами? К примеру перед пользователем появляется вывод и нужно ввести, например, цвет. RED, ORANGE и т.д. А в темах перечисления и классы enum рассказывается только о таком способе. Через цифру как-то некрасиво.

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

Доброго времени суток, в чем смысл указывать в return std::string, все прекрасно работает и без него, либо я чего-то не понимаю. Сама функция же имеет тип возвращаемого значения string.

Да, ты прав, функция имеет возвращаемый тип std::string, по этому если не использовать конструкторы типа std::string в возвращаемом типе, то каст const char* в std::string будет произведен неявно. Видимо это сделано для наглядности происходящего.

Возможно ли вывести через оператор std::cout на экран не значение одного из перечеслителей а сам перечеслитель? ( не значение цвета RED = 1, в виде еденицы а само RED )

С помощью Switch или If else;

Очень мотивируют живые примеры с оружием и монстрами, а не с поднадоевшими студентами

…сразу окончание анекдота: «Ну вот ты например кем работаешь?»
«Автослесарем, а что?»
«А теперь представь себе: в отпуске лежишь себе на пляже, а вокруг — машины, машины, машины…»:-)

Прочитав урок 3 раза и туго понимая что к чему, я таки нашел ключевую фразу, которая сразу прояснила все в голове. Все стало понятно. Думаю не я один такой, поэтому рассказываю:
для меня этой ключевой фразой послужил 3-ий сверху комментарий в 1-ом коде урока. // Это все возможные значения этого типа данных
…Шит!… это же ТИП данных, такой же как int или char! А перечисление — это буквально ПЕРЕЧИСЛЕНИЕ всех символьных имен этого( создаваемого нами самими типа), с присвоением им порядковых, или иных, на выбор, номеров! Т.е. просто перечисляем по очереди имена всех возможных значений этого типа, и присваиваем им ( или это делает автоматически компилятор) целочисленные идентификационные значения (номера). И конечно, они могут быть только константными(постоянными). Это же логично. К примеру, в типе CHAR , мы же заранее знаем все символьные значения и их числовые эквиваленты, и все это неизменно. А здесь у нас свобода назвать свой тип данных, выбрать символы и их числовые эквиваленты. Кстати, получается таблица ASII с ее символами и нумерацией, это тоже своего рода перечисление, только по умолчанию. Вот и все!

Перечисления перечислениями , а мне непонятно одно — для чего нужны переменные типа перечисления если и без них всё работает. Ответа нигде не нашёл.

Перечисления нужны:
1) для лучшего комментирования кода;
2) для упрощения разработки.
Как минимум.

Тест №3 — подстава, с плавающей ничего не было) Хотя я внимательно читал — целочисловые.

Вот присвоение значений других определителей — тоже самое, нету об этом, хотя что стоит дать число от другого, когда можно дать любое число перечислителю.

Источник