Sportscar имеет больше дверей, чем Sedan? No
*/
Пример 10.2. Применение метода Format для форматирования значений элементов перечисления.
#include "stdafx.h"
using namespace System;
enum class Colors { Red, Green, Blue, Yellow };
int main() {
Colors myColor = Colors::Blue;
Console::WriteLine("Мой любимый цвет – {0}.", myColor);
Console::WriteLine("Десятичное значение цвета – {0}.",
Enum::Format(Colors::typeid, myColor, "d"));
Console::WriteLine("Шестнадцатеричное значение цвета – {0}.",
Enum::Format(Colors::typeid, myColor, "x"));
Console::ReadLine();
return 0;
}
/* Вывод:
Мой любимый цвет – Blue.
Десятичное значение цвета – 2.
Шестнадцатеричное значение цвета – 00000002.
*/
Пример 10.3. Использование методов GetName, GetNames, GetValues и IsDefined для работы с перечислениями.
#include "stdafx.h"
using namespace System;
enum class Colors { Red, Green, Blue, Yellow };
int main() {
Console::Write("Элементы перечисления Colors: ");
for each (String^ st in Enum::GetNames(Colors::typeid))
Console::Write(" {0} ", st);
Console::WriteLine(".");
Console::Write("Значения элементов перечисления Colors: ");
For each (int i in Enum::GetValues(Colors::typeid))
Console::Write(" {0} ", i);
Console::WriteLine(".");
Console::WriteLine("2-й элемент перечисления Colors – {0}.",
Enum::GetName(Colors::typeid, 1));
Colors value = Colors::Blue;
Console::WriteLine("{0:D} содержится в перечислении Colors? {1}.",
value, Enum::IsDefined(Colors::typeid, value));
Console::WriteLine("{0} содержится в перечислении Colors? {1}.",
value, Enum::IsDefined(Colors::typeid, value));
Console::ReadLine();
return 0;
}
/* Вывод:
Элементы перечисления Colors: Red Green Blue Yellow.
Значения элементов перечисления Colors: 0 1 2 3.
Й элемент перечисления Colors – Green.
Содержится в перечислении Colors? True.
Blue содержится в перечислении Colors? True.
*/
Перечисления с битовыми флагами
(https://msdn.microsoft.com/ru-ru/library/system.flagsattribute.aspx)
Пример 10.4. Определение другой версии перечисления Days, имеющей имя Days2. В Days2 имеется атрибут FlagsAttribute и каждому элементу присваивается следующая степень числа 2. При создании переменной типа перечисления Days2 она получает значение Days2::.Tuesday и Days2::Thursday. Для установки флагов в перечислении, проверки факта установки конкретного флага и удаления флага используются побитовые операторы OR, XOR и AND.
#include "stdafx.h"
using namespace System;
[FlagsAttribute]
enum class Days2: char {
None = 0x0, // Флаги не установлены
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
};
int main() {
// Объявление и инициализация переменной двумя флагами
// с помощью поразрядного ИЛИ (OR).
Days2 meetingDays = Days2::Tuesday | Days2::Thursday;
Console::WriteLine("Дни встреч – {0}.", meetingDays);
// Вывод: Дни встреч – Tuesday, Thursday.
// Установка дополнительного флага с помощью
// поразрядного ИЛИ (OR).
meetingDays = meetingDays | Days2::Friday;
Console::WriteLine("Дни встреч – {0}.", meetingDays);
// Вывод: Дни встреч – Tuesday, Thursday, Friday.
// Удаление флага с помощью поразрядного исключающего ИЛИ (XOR).
meetingDays = meetingDays ^ Days2::Tuesday;
Console::WriteLine("Дни встреч – {0}.", meetingDays);
// Вывод: Дни встреч – Thursday, Friday.
// Проверка значений флагов с помощью поразрядного И (AND).
bool test = (meetingDays & Days2::Thursday) == Days2::Thursday;
Console::WriteLine("Thursday {0} – день встречи.",
test == true? "": "не");
// Вывод: Thursday – день встречи.
Console::ReadLine();
return 0;
}
Пример 10.5. Использование метода FlagsAttribute.
#include "stdafx.h"
using namespace System;
// Определение перечисления без битовых флагов (FlagsAttribute).
public enum class SingleHue: char {
None = 0,
Black = 1,
Red = 2,
Green = 4,
Blue = 8
};
// Определение перечисления с битовыми флагами (FlagsAttribute).
[FlagsAttribute]
enum class MultiHue: char {
None = 0,
Black = 1,
Red = 2,
Green = 4,
Blue = 8
};
int main() {
// Отображение всех возможных комбинаций значений.
Console::WriteLine("Все возможные комбинации значений " +
"без битовых флагов (FlagsAttribute):");
for (int val = 0; val <= 16; val++)
Console::WriteLine("{0,3} - {1:G}", val, (SingleHue)val);
// Отображение всех комбинаций значений и недопустимых значений.
Console::WriteLine("\nВсе возможные комбинации значений " +
"с битовыми флагами (FlagsAttribute):");
for (int val = 0; val <= 16; val++)
Console::WriteLine("{0,3} - {1:G}", val, (MultiHue)val);
Console::ReadLine();
return 0;
}
/* Вывод:
Все возможные комбинации значений без битовых флагов (FlagsAttribute):
None
Black
Red
3 - 3
Green
5 - 5
6 - 6
7 - 7
Blue
9 - 9
10 - 10
11 - 11
12 - 12
13 - 13
14 - 14
15 - 15
16 - 16
Все возможные комбинации значений c битовыми флагами (FlagsAttribute):
None
Black
Red
Black, Red
Green
Black, Green
Red, Green
Black, Red, Green
Blue
Black, Blue
Red, Blue
Black, Red, Blue
Green, Blue
Black, Green, Blue
Red, Green, Blue
Black, Red, Green, Blue
16 – 16
*/
Пример 10.6. Использование перечислений для представления именованных значений и битовых полей (флагов).
#include "stdafx.h"
using namespace System;
enum class Days {