C++ содержит довольно много встроенных типов данных. Но этих типов бывает не всегда достаточно для того, что мы хотим сделать. Итак, C++ содержит возможности, позволяющие программистам создавать свои собственные типы данных. Эти типы данных называются пользовательскими типами данных.
Возможно, самый простой пользовательский тип данных – это перечислимый тип. Перечислимый тип (также называемый перечислением или enumeration, enum) – это тип данных, в котором каждое возможное значение определяется как символьная константа (называемая перечислителем, enumerator). Перечисления определяются с помощью ключевого слова enum . Давайте посмотрим на пример:
// Определение нового перечисления с именем Color enum Color < // Это перечислители // Они определяют все возможные значения, которые этот тип может содержать // Каждый перечислитель отделяется запятой, а не точкой с запятой color_black, color_red, color_blue, color_green, color_white, color_cyan, color_yellow, color_magenta, // после последнего перечислителя может быть запятая, но она не обязательна >; // однако само перечисление должно заканчиваться точкой с запятой // Определяем несколько переменных перечислимого типа Color Color paint = color_white; Color house(color_blue); Color apple < color_red >;
Определение перечисления (или любого пользовательского типа данных) не занимает никакой памяти. Когда определяется переменная перечислимого типа (например, переменная paint в приведенном выше примере), для этой переменной память выделяется.
Обратите внимание, что каждый перечислитель отделяется запятой, а всё перечисление заканчивается точкой с запятой.
Именование перечислений и перечислителей
Указание имени для перечисления необязательно, но часто оно указывается. Перечисления без имени иногда называют анонимными перечислениями. Имена перечислений часто начинаются с заглавной буквы.
Перечислителям должны быть даны имена, и они обычно используют тот же стиль именования, что и константные переменные. Иногда перечислителям даются имена ПОЛНОСТЬЮ_ЗАГЛАВНЫМИ_БУКВАМИ, но делать это не рекомендуется, поскольку это может привести к путанице с именами макросов препроцессора.
Область видимости перечислителя
Поскольку перечислители помещаются в то же пространство имен, что и перечисление, имя перечислителя нельзя использовать в нескольких перечислениях в одном пространстве имен:
enum Color < red, blue, // blue помещается в глобальное пространство имен green >; enum Feeling < happy, tired, blue // ошибка, blue уже использовался в enum Color в глобальном пространстве имен >;
Следовательно, для предотвращения конфликтов имен и для документирования кода в именах перечислителей обычно используются префиксы, например, animal_ или color_ .
Значения перечислителей
Каждому перечислителю в зависимости от его позиции в списке перечисления автоматически присваивается целочисленное значение. По умолчанию первому перечислителю присваивается целочисленное значение 0, а каждому последующему перечислителю присваивается значение на единицу больше, чем у предыдущего перечислителя:
enum Color < color_black, // присвоено значение 0 color_red, // присвоено значение 1 color_blue, // присвоено значение 2 color_green, // присвоено значение 3 color_white, // присвоено значение 4 color_cyan, // присвоено значение 5 color_yellow, // присвоено значение 6 color_magenta // присвоено значение 7 >; Color paint< color_white >; std::cout
Приведенная выше инструкция с cout выводит значение 4.
Значение перечислителя можно определить явно. Эти целочисленные значения могут быть положительными или отрицательными и могут иметь те же значения, что и у других перечислителей. Любым неопределенным перечислителям присваивается значение на единицу больше, чем у предыдущего перечислителя.
// определяем новое перечисление с именем Animal enum Animal < animal_cat = -3, animal_dog, // присвоено -2 animal_pig, // присвоено -1 animal_horse = 5, animal_giraffe = 5, // имеет то же значение, что и animal_horse animal_chicken // присвоено 6 >;
Обратите внимание, что в этом случае animal_horse и animal_giraffe имеют одинаковые значения. Когда это происходит, перечислители становятся неразличимыми – по сути, animal_horse и animal_giraffe взаимозаменяемы. Хотя C++ позволяет это, обычно следует избегать присвоения одного и того же значения двум перечислителям в одном перечислении.
Лучшая практика
Не назначайте перечислителям конкретные значения.
Лучшая практика
Не присваивайте одно и то же значение двум перечислителям в одном перечислении, если в этом нет веской причины.
Вычисление перечислимого значения и ввод/вывод
Поскольку перечислимые значения вычисляются как целочисленные значения типа int , они могут быть присвоены целочисленным переменным. Это означает, что они также могут выводиться (как целочисленные значения), поскольку std::cout знает, как выводить целые числа.
int mypet< animal_pig >; std::cout
Это дает следующий результат:
Компилятор не будет неявно преобразовывать целочисленное значение int в перечислимое значение. Следующее приведет к ошибке компиляции:
Animal animal< 5 >; // вызовет ошибку компилятора
Однако вы можете заставить его сделать это с помощью static_cast :
auto color< static_cast(5) >; // некрасиво
Компилятор также не позволит вам выполнить ввод перечисления с помощью std::cin :
enum Color < color_black, // присвоено 0 color_red, // присвоено 1 color_blue, // присвоено 2 color_green, // присвоено 3 color_white, // присвоено 4 color_cyan, // присвоено 5 color_yellow, // присвоено 6 color_magenta // присвоено 7 >; Color color<>; std::cin >> color; // вызовет ошибку компилятора
Один из способов решения проблемы – прочитать значение int и использовать static_cast , чтобы заставить компилятор поместить целочисленное значение в перечислимый тип:
int inputColor<>; std::cin >> inputColor; auto color< static_cast(inputColor) >;
Каждый перечислимый тип считается отдельным типом. Следовательно, попытка присвоить перечислители из одного типа перечисления другому типу перечисления вызовет ошибку компиляции:
Animal animal< color_blue >; // вызовет ошибку компиляции
Если вы хотите использовать другой целочисленный тип для перечислителей, например, для экономии полосы пропускания при передаче значения перечислителя по сети, вы можете указать его в объявлении перечисления.
// Использовать в качестве базы для перечисления // 8-битный целочисленный тип без знака. enum Color : std::uint_least8_t < color_black, color_red, // . >;
Поскольку перечислители обычно не используются для арифметических операций или сравнений, использовать целочисленные типы без знака здесь безопасно. Также, когда мы хотим выполнить предварительное объявление перечисления, необходимо указать его базу.
enum Color; // Ошибка enum Color : int; // Okay // . // Поскольку Color был предварительно объявлен с фиксированной базой, // нам необходимо снова указать базу и в определении. enum Color : int < color_black, color_red, // . >;
Как и в случае с константными переменными, перечислимые типы отображаются в отладчике, что делает их более полезными в этом отношении, чем значения определенные с помощью #define .
Печать перечислителей
Как вы видели выше, попытка напечатать перечислимое значение с помощью std::cout приводит к печати целочисленного значения перечислителя. Так как же распечатать сам перечислитель в виде текста? Один из способов сделать это – написать функцию и использовать оператор if или switch :
enum Color < color_black, // присвоено 0 color_red, // присвоено 1 color_blue, // присвоено 2 color_green, // присвоено 3 color_white, // присвоено 4 color_cyan, // присвоено 5 color_yellow, // присвоено 6 color_magenta // присвоено 7 >; void printColor(Color color) < switch (color) < case color_black: std::cout >
Выделение памяти для переменных типа enum и предварительное объявление
Типы enum считаются частью целочисленного семейства типов, и компилятор должен определить, сколько памяти выделить для переменной enum . Стандарт C++ говорит, что размер перечисления должен быть достаточно большим, чтобы представлять значения всех перечислителей. Чаще всего он делает переменные перечисления того же размера, что и стандартный тип int .
Поскольку компилятору необходимо знать, сколько памяти выделить для перечисления, предварительно объявлять их вы можете только при указании фиксированной базы. Поскольку определение перечисления не выделяет никакой памяти, если перечисление необходимо в нескольких файлах, можно определить его в заголовке и включить с помощью #include этот заголовок везде, где это необходимо.
Чем полезны перечислители?
Перечислимые типы невероятно полезны для документирования кода и удобства чтения, когда вам нужно представить конкретный, предопределенный набор состояний.
Например, старые функции для представления кодов ошибок, когда что-то пошло не так внутри функции, иногда возвращают вызывающему целые числа. Обычно для обозначения различных возможных кодов ошибок используются небольшие отрицательные числа. Например:
int readFileContents() < if (!openFile()) return -1; if (!readFile()) return -2; if (!parseFile()) return -3; return 0; // успех >
Однако использование подобных магических чисел не очень наглядно. Альтернативный метод – использование перечислимого типа:
enum ParseResult < // для наших перечислителей нам не нужны конкретные значения success, error_opening_file, error_reading_file, error_parsing_file >; ParseResult readFileContents()
Это намного легче читать и понимать, чем использовать магические числа в качестве возвращаемого значения. Кроме того, вызывающий может проверить возвращаемое значение функции по соответствующему перечислителю, что легче понять, чем проверять возвращаемый результат на совпадение с определенным целочисленным значением.
if (readFileContents() == success) < // сделать что-то >else < // вывести сообщение об ошибке >
Перечислимые типы лучше всего использовать при определении набора связанных идентификаторов. Например, предположим, что вы пишете игру, в которой игрок может носить один предмет, но этот предмет может быть нескольких разных типов. Вы могли бы сделать это так:
#include #include enum ItemType < itemtype_sword, itemtype_torch, itemtype_potion >; std::string getItemName(ItemType itemType) < switch (itemType) < case itemtype_sword: return «Sword»; case itemtype_torch: return «Torch»; case itemtype_potion: return «Potion»; >// На всякий случай, если в будущем добавим новый элемент и забудем обновить эту функцию return «. «; > int main() < // ItemType — это перечислимый тип, который мы определили выше. // itemType (i в нижнем регистре) — это имя нашей переменной (типа ItemType). // itemtype_torch — это перечислимое значение, которым мы инициализируем переменную itemType. ItemType itemType< itemtype_torch >; std::cout
Или, в качестве альтернативы, если бы вы писали функцию для сортировки кучи значений:
enum SortType < sorttype_forward, sorttype_backwards >; void sortData(SortType type) < if (type == sorttype_forward) // сортируем данные в прямом порядке else if (type == sorttype_backwards) // сортируем данные в обратном порядке >
Многие языки используют перечисления для определения логических значений. Логическое значение – это, по сути, просто перечисление с двумя перечислителями: false и true ! Однако в C++ значения true и false определяются как ключевые слова, а не как перечислители.
Небольшой тест
Вопрос 1
Определите перечислимый тип, чтобы выбрать одну из следующих рас монстров: орки, гоблины, тролли, огры и скелеты.
enum MonsterType < monster_orc, monster_goblin, monster_troll, monster_ogre, monster_skeleton >;
Вопрос 2
Определите переменную перечислимого типа, который вы определили в ответе на вопрос 1, и инициализируйте ее с помощью перечислителя троллей.
auto monsterType< MonsterType::monster_troll >; // Тип очевиден, можно использовать auto. // Мы использовали префикс MonsterType:: для согласованности со следующим уроком.
Вопрос 3
Верно или нет. Перечислителями могут быть:
- заданное целочисленное значение
- неприсвоенное значение
- заданное значение с плавающей запятой
- отрицательное значение
- неуникальное значение
- значение, инициализированное значением предыдущего перечислителя (например, color_magenta = color_red )
- Верно.
- Верно. Перечислителям, которым не присвоено значение, будет неявно присвоено целочисленное значение предыдущего перечислителя + 1. Если предыдущего перечислителя нет, перечислитель примет значение 0.
- Неверно.
- Верно.
- Верно.
- Верно. Поскольку перечислители вычисляются как целые числа, а целые числа могут быть присвоены перечислителям, перечислители могут быть инициализированы другими перечислителями (хотя обычно для этого нет особых причин!).
Источник: radioprog.ru
E-NUM: как ответить на число вопрос в вебмани? Число- ответ где брать?
Число- ответ: что нужно написать? СМС не приходила.
Вход с ноутбука, приложения не устанавливала.
При переходе в личный кабинет
комментировать
в избранное up —>
mycha nge [72.4K]
5 лет назад
Ответ генерирует только приложение для смартфона. У меня та же проблема, изменила e-mail, теперь не могу подтверждать платежи без смс, а они платные. Смартфон на другой операционной системе, нужен смартфон на андроид, windows или iOS, установить приложение, которое отсканирует число-вопрос и сгенерирует ответ.
По этой ссылке можно установить приложение, а здесь инструкция для андроид.
Если не хотите устанавливать приложение на смартфон, можно воспользоваться эмулятором Nox App Player, Droid4X или BlueStacks.
автор вопроса выбрал этот ответ лучшим
комментировать
в избранное ссылка отблагодарить
gr0m0 va [19.3K]
3 года назад
Чтобы ответить на число вопрос в Webmoney от e-num, нужно иметь специальное приложение «E-NUM», которое можно скачать в Google Play маркет. Ответ сгенерирует только специальное приложение для смартфона. Данное приложение можно установить как на андроид, так и на windows или iOS. После чего оно отсканирует число-вопрос и сгенерирует для вас ответ.
Но если же вы не желаете скачивать и устанавливать приложение «E-NUM» на свой смартфон, то можно также воспользоваться эмулятором Droid4X, BlueStacks или же Nox App Player. Удачи Вам!
Источник: www.bolshoyvopros.ru
Что такое число ответ в E-NUM
По договору возмездного оказания услуг исполнитель обязуется по заданию заказчика оказать услуги (совершить определенные действия или осуществить определенную деятельность), а заказчик обязуется оплатить эти услуги.
В нём и указано такое условие.
Вам помог ответ? Да Нет
Юрист • г. Новокузнецк
21.09.2016, 00:18
E-NUM- сервис аутенфикации без пароля.
Аутентифика́ция — процедура проверки подлинности, например: проверка подлинности пользователя путём сравнения введённого им пароля с паролем, сохранённым в базе данных пользователей..
В форме аутентификации на сайте вам отображается число-вопрос
получает PUSH-уведомление и отображает единственно верное число-ответ.Вы должны ввести это число вопрос в В E-NUM клиенте, в ответ получите число ответ. Его вводите в форму авторизации.
Вводите число-ответ в форму — вы аутентифицированы!
Введя это число вы получите возможность пользоваться услугами либо какого сайта,либо какого nj сервиса,например WEBMONEY/
Пользование может быть как на условиях платности ст779 ГК РФ .
Согласно п. 3 ст. 423 ГК РФ договор предполагается возмездным, если из закона, иных правовых актов, содержания или существа договора не вытекает иное. Поэтому возможно пользование услугами сервиса как на платной основе,так и на безвозмездной.
Вам помог ответ? Да Нет
Юрист • г. Тольятти
21.09.2016, 08:08
Число-ответ вы можете найти в бесплатном приложении E-NUM, если установите его на своем мобильном устройстве.
E-NUM – это система авторизации, она используется для дополнительной защиты закрытых ресурсов онлайн-сервисов посредством секретного ключа (то есть кодовой книги), хранимой в мобильном устройстве (смартфон/планшет).
1. Вы устанавливаете приложение E-NUM клиент для мобильных, с зашитым уникальным для каждого пользователя шифроблокнотом.
2. В форме авторизации (на сайте, в программе) в ответ на введенный регистрационный e-mail вам отображается неповторяющееся число-вопрос.
3. В E-NUM клиенте вводите число-вопрос, получаете единственно верный для вашего приложения число-ответ.
4. Вводите число-ответ в форму и вы авторизованы!
Условия Пользовательского Соглашения являются публичной
офертой в соответствии со ст. 437 Гражданского кодекса Российской
Фeдерации и использование Приложения E-NUM возможно исключительно на условиях Пользовательского Соглашения.
Вам помог ответ? Да Нет
Похожие вопросы
• г. Краснодар
Число вопрос — стоит 41356 число ответ — что писать. это для аутентификации в E — NUM
Юрист • г. Красноярск
20.09.2016, 18:52
А меня текст заполняется на русском )
Вам помог ответ? Да Нет
Скажите входит ли время доставки почтой ответа на обращение граждан в срок оговоренный в законе?
Скажите входит ли время доставки почтой ответа на обращение граждан в срок оговоренный в законе? Например, претензия отдана ответчику 10 числа, а ответ пришел 28 числа, но дата в письме стоит 18 число.
Юрист • г. Санкт-Петербург
09.04.2017, 11:39
[quote]Федеральный закон от 02.05.2006 N 59-ФЗ (ред. от 03.11.2015) «О порядке рассмотрения обращений граждан Российской Федерации»
Статья 12. Сроки рассмотрения письменного обращения
1. Письменное обращение, поступившее в государственный орган, орган местного самоуправления или должностному лицу в соответствии с их компетенцией, рассматривается [b]в течение 30 дней со дня регистрации письменного обращения[/b], за исключением случая, указанного в части 1.1 настоящей статьи.
1.1. Письменное обращение, поступившее высшему должностному лицу субъекта Российской Федерации (руководителю высшего исполнительного органа государственной власти субъекта Российской Федерации) и содержащее информацию о фактах возможных нарушений законодательства Российской Федерации в сфере миграции, рассматривается в течение 20 дней со дня регистрации письменного обращения.
2. В исключительных случаях, а также в случае направления запроса, предусмотренного частью 2 статьи 10 настоящего Федерального закона, руководитель государственного органа или органа местного самоуправления, должностное лицо либо уполномоченное на то лицо вправе продлить срок рассмотрения обращения не более чем на 30 дней, уведомив о продлении срока его рассмотрения гражданина, направившего обращение.
Источник: www.9111.ru
Enum в C# и некоторые его особенности
За свою непродолжительную карьеру C# разработчика я успел поверхностно погрузиться во многие аспекты этого, без преувеличения, прекрасного языка. Наиболее любопытной из них для меня является такая, с первого взгляда, простая вещь, как перечисления или же enum, о коей я попытаюсь рассказать в этой статье.
Что же такое enum и на кой он вообще нужен?
Представим что нам необходимо определить такое свойство класса как цвет. Как же нам решить эту проблему?
Мы можем сделать это через строковую переменную:
public class ClassWithString < public ClassWithString(string color) < Color = color; >public string Color < get; >public bool IsDefinedColor(string otherColor) => Color.Equals(otherColor); >
var redClass = new ClassWithString(«Red»); var check = redClass.IsDefinedColor(«Red»); //true var secondCheck = redClass.IsDefinedColor(«Blue»); //false
В результате выполнения кода значение check будет равно true, а secondCheck будет равно false. Вроде бы задача решена, в прод.
Но человек существо не идеальное, и может случиться такое, что в метод будет передано не Red, а red или rad. Вроде-бы человек может догадаться что было ему сказано, но машина прямолинейна и догадываться не будет. В результате некорректного ввода метод будет возвращать false, хотя мы ожидаем true:
var redClass = new ClassWithString(«Red»); var check = redClass.IsDefinedColor(«Red»); //true var secondCheck = redClass.IsDefinedColor(«blue»); //false var thirdCheck = redClass.IsDefinedColor(«red»); //false var fourthCheck = redClass.IsDefinedColor(«rad»); //false
Конечно первый вид опечатки можно исправить добавлением в Equals дополнительного параметра StringComparison.OrdinalIgnoreCase. Но этого не сделать при второй опечатке. Значит строки нам не особо подходят.
Color.Equals(otherColor, StringComparison.OrdinalIgnoreCase);
Иным решением может быть хранение значений в численной переменной, заранее определив какому числу какое состояние соответствует.
//0 — red //1 — blue public class ClassWithInt < public ClassWithInt(int color) < Color = color; >public int Color < get; >public bool IsDefinedColor(int otherColor) => Color.Equals(otherColor); >
Вроде-бы проблема решена: теперь никто не опечатается при вводе кода цвета. Но здесь всплывает другая проблема: человек не машина, и работать со словами ему на порядок проще чем с числами.
Постоянно помнить, что 0 — это красный, а 1 — это синий, никакой памяти не напасёшься. А если человек поменяет проект и под номером 0 будет белый, а под 1 черный? Ерунда какая-то.
И тут нам на помощь приходит генная инженерия, позволяющая нарушить базовые законы колдовства и естества. Мы можем скрестить числа и строки. После столь противоестественного действия мы и получим любимый мною enum.
Enum-ом в базовом понимании называют некий список возможных, заранее определенных, именованных значений. Нужен этот список для того, чтобы упростить работу разработчику в оперировании некими состояниями. Решим нашу задачу с применением enum.
public class ClassWithEnum < public ClassWithEnum(Colors color) < Color = color; >public Colors Color < get; >public bool IsDefinedColor(Colors otherColor) => Color.Equals(otherColor); public enum Colors < Red, Blue >>
Как можно увидеть внизу нашего класса мы определили тот самый enum и сказали, что он может принимать 2 значения: Red и Blue. Теперь повторим вызов из примера со строками:
var redClass = new ClassWithEnum(ClassWithEnum.Colors.Red); var check = redClass.IsDefinedColor(ClassWithEnum.Colors.Red); //true var secondCheck = redClass.IsDefinedColor(ClassWithEnum.Colors.Blue); //false
Как можно заметить, всё понятно, ясно, чЁтКо. А теперь попытаемся опечататься:
var redClass = new ClassWithEnum(ClassWithEnum.Colors.Red); var check = redClass.IsDefinedColor(ClassWithEnum.Colors.Red); //true var secondCheck = redClass.IsDefinedColor(ClassWithEnum.Colors.Blue); //false var thirdCheck = redClass.IsDefinedColor(ClassWithEnum.Colors.red); //Ошибка ввода var fourthCheck = redClass.IsDefinedColor(ClassWithEnum.Colors.rad); //Ошибка ввода
Редактор кода говорит, что я дурачок и не умею правильно писать слова. А это значит, что я могу заметить ошибку ещё до сборки и гарантированно её замечу во время сборки. Спасибо, добрый блокнот.
В принципе на этом можно было бы и закончить статью, но тогда какой в ней смысл, если это повествование можно было сократить раза в четыре. Непорядок! Поэтому, после базового пояснения что такое enum и нафига он нужен будут настоящие сенсации. Внимание, барабанная дробь.
Enum это число!1!1!1
Как было сказано выше enum — это, по сути, плод запретной любви строки и числа. От строки, как было показано, опять же, выше enum получил отличную человекочитаемость. От числа enum получил устойчивость к неправильному вводу. Но, помимо этого, от числа enum получил и внутренности.
По сути enum это обыкновенное число с табличкой. В примере выше это было не явно потому, что в списке были только имена, но не было чисел. Это не совсем правильный, хотя и рабочий по причине автопроставления чисел, подход к определению enum-а. Более правильным будет следующий подход:
public enum Colors
Из того, что enum — это число с бейджиком, следует несколько особенностей:
- Возможность хранения нескольких булевых свойств в битовых флагах
- Возможность приведения числа к enum.
- Особенное приведение одного enum-а к другому.
Разберем эти особенности:
Битовые флаги
Предположим мы имеем некий объект, обладающий рядом булевых свойств. Мы, несомненно, можем описать их в виде нескольких самостоятельных полей типа bool. Данный подход является вполне приемлемым:
public class ClassWithBools < public ConditionsBools Conditions < get; set; >public class ConditionsBools < public bool HasSomething < get; set; >public bool DoSomething < get; set; >public bool HasAnother < get; set; >public bool DoAnother < get; set; >> >
Однако, есть иной способ определить эти атрибуты. Для этого мы можем использовать такую надстройку над enum-ом, как битовые флаги. Подобная конструкция представляет из себя обыкновенное enum-ом, обладающее атрибутом [Flags] и числовыми значениями, представляющими из себя степени двойки:
public class ClassWithFlags < public ConditionsFlags Conditions < get; set; >[Flags] public enum ConditionsFlags < HasSomething = 1, //0001 DoSomething = 2, //0010 HasAnother = 4, //0100 DoAnother = 8 //1000 >>
Как же работать с бинарным флагом? В случае использования отдельных булевых переменных всё достаточно очевидно: обращайся к конкретной переменной и читай или же присваивай значение. Но в случае же работы битовыми флагами приходится использовать базовые двоичные операции: конъюнкция (И, classWithFlags.Conditions |= ConditionsFlags.DoAnother; //Присвоение значения bool hasClassDoAnother = (Conditions //Чтение значения
Как можно увидеть, работа с битовыми флагами является несколько нестандартной. Помимо этого неудобства, битовый флаг подразумевает, что состояние всегда определено и равно либо true, либо false, и не может быть равно null. Данная особенность может являться недостатком, поскольку порой постановка задачи может подразумевать, что состояние может быть неизвестно.
Битовый флаг является достаточно специфичным типом данных. Его использование вместо структуры, обладающей булевыми переменными, зачастую является спорным, но иногда вполне оправданным. Одним из неочевидных преимуществ использования флагов является следующий момент: в случае использования битовых флагов нет необходимости обновлять структуру базы данных каждый раз, как появляется новое свойство, поскольку в базе данных подобные флаги зачастую хранятся в виде чисел.
Приведение числа к enum
В ходе решения некой задачи нам может понадобиться на время расширить допустимый диапазон значений enum, но вот незадача, мы не хотим чтобы дополнительные значения были видны извне написанного нами кода, или же мы не имеем доступа к редактированию enum по причине того, что он не наш и поставляется нам сторонней библиотекой. Как же быть, спросите вы. А всё легко и просто, следите за руками.
public class ClassWithEnumCast < private const Colors TempColor = (Colors)int.MaxValue; private readonly Colors[] _colorsOrder = < Colors.Red, TempColor, Colors.Black, Colors.White, Colors.Blue >; public IEnumerable GetOrder(Colors color) => _colorsOrder.Select(x => x is TempColor ? color : x ).Distinct(); public enum Colors < Red = 0, Blue = 1, White = 3, Black = 4 >>
В представленном коде решается задача кастомной сортировки цветов с учетом того, что на второй позиции должен находиться передаваемый в функцию цвет. Для определения плейсхолдера я использую возможность приведения числа к enum. Данная константа является неименованным enum-ом, который, в принципе, может существовать и за пределами этого класса. В случае необходимости обращения к нему необходимо лишь снова привести исходное число к данному enum-у.
В случае же, если мы приведем уже использованное в перечислении число, в переменной будет находиться соответствующее значение:
var color = (Colors)1; //Blue var undefinedColor = (Colors)5; //5
Приведение одного enum к другому
Представим, что нам необходимо привести один enum к другому, например при маппинге одной структуры к другой. Как же поведет себя enum? Определим пару enum-ов и попробуем это сделать:
public enum Colors1 < Red = 0, Blue = 1 >public enum Colors2
В представленном примере мы создали два enum-а, один из которых обладает всеми значениями второго, но со смещенной из-за дополнительного значения нумерацией. Теперь попробуем привести первый enum ко второму:
var color = (Colors2)Colors1.Red; //White
Но как же так, вроде же мы должны были получить значение Red, но получили White? Всё дело в том, что enum, как было сказано выше, является лишь именованным числом и приведение происходит именно по числовому значению. В случае необходимости подобного приведения потребуется написать дополнительный хелпер или явно описать каст через implicit/explicit.
public static Colors2 Cast(this Colors1 color) => color switch < Colors1.Red =>Colors2.Red, Colors1.Blue => Colors2.Blue, _ => Colors2.White >;
Бонусный контент
Подобный пример был создан на основе комментария с просторов Метанита. Предположим мы решим в край упороться и написать следующий enum (так делать не надо, пнятнеько):
enum Colors
А затем посмотреть как он будет себя вести:
var color1 = Colors.Black; //White var color2 = Colors.Red; //Blue
Что же за магия происходит в этом примере?
Поскольку у значения White явно не указано число, ему автоматически предоставляется число предыдущего значения +1, а поскольку это значение первое и перед ним ничего нет ему будет проставлено значение 0. Далее мы явно указываем для Black значение 0, что дублирует уже предоставленное значение для White. А поскольку White определено до Black, то и при обращении по значению 0 мы получим именно White.
В случае же color2, из-за описанной выше логики автопроставления чисел, значению Red было проставлено число 2+1=3. А при получении значения по числу вернулось первое в списке с таким числом.
Такие вот дела, ребята. А на сегодня всё.
Источник: habr.com
E-Num https://forum.webmoney.com/index.php?/topic/36946-
Пытаюсь войти в E-Num, там в поле заполнения написано Вопрос: Цифры и Ответ: нужно ввести цифры. задаюсь вопросом, какие надо цифры вводить ? А то так все понятно, вопрос ( цифры ), ответ. не понятно на что отвечать.
И как долго вы проверяете паспортные данные ? еще часа 2-4 назад отправил на проверку, не уж что так долго нужно ждать, чтобы добавить еще один кошелек ?
#2 Знаток Yuri Baranov (WMID 273418986140 )
- Группа: Пользователи
- сообщений 527
- Россия
- Webmoney BL
Отправлено 16 марта 2015 — 17:38
Мне лично ничего не понятно, что надо делать. Больше ничего нету, тупо вопрос и ответ, и. какой должен быть ответ ? Где его взять ?
#8 Пользователь DamiraWolf (WMID 345108640106 )
- Группа: Пользователи
- сообщений 5
- Регистрация: 14-апреля 15
- Webmoney BL
Отправлено 14 апреля 2015 — 06:22
Мне лично ничего не понятно, что надо делать. Больше ничего нету, тупо вопрос и ответ, и. какой должен быть ответ ? Где его взять ?
Все не так сложно. что бы получить ответ, у вас должно быть установлено приложение(на мобильный) E-num, на офф.сайте проходите регистрацию с использованием своей почты. там же все расписано по работе программы
смысл в том,что число вопрос «приходит» в приложение, которое в свою очередь генерирует требуемое число-ответ
копирайтер — это не профессия. а стиль жизни
Источник: forum.web.money