[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
Атрибут [Flags] слід використовувати у всіх випадках, коли перелічуваний являє собою колекцію можливих значень, а не одне значення. Такі колекції часто використовуються, наприклад, з побітовими операторами:
1 2 3 4 5 6 7 8 9 10 11 |
[Flags] enum Month { January = 2, June = 4, July = 8, August = 16, November = 32, December = 64, Winter = November | December | January } |
В одну змінну перерахування, ви можете присвоїти кілька значень:
1 2 3 4 5 6 |
static void Main() { Month myBestMonths = Month.December | Month.July | Month.June; Console.WriteLine(myBestMonths); //June, July, December Console.WriteLine((int)myBestMonths); //19 } |
Так само, ви можете зсувати попередні значення по бітах, а не використовувати числа. Не обов’язково рекомендувати це, але просто вказати, що це можливо:
1 2 3 4 5 6 7 8 9 10 |
[Flags] enum Month { January = 0, June = 1 << 0,//1 July = 1 << 1,//2 August = 1 << 2,//4 November = 1 << 3,//8 December = 1 << 4//16 } |
Коректно відобразити значення перерахування можна таким чином:
1 2 3 4 5 6 7 |
static void Main() { foreach (var e in Enum.GetValues(typeof(Month))) { Console.WriteLine("{0} = {1}", e.ToString(), (int)e); } } |
Під час роботи з прапорами я часто оголошую додаткові елементи None і All. Вони допомагають перевірити, чи всі прапори встановлені або жоден прапор не встановлений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
static void Main() { Month allMonths = Month.January | Month.June | Month.July | Month.August | Month.November | Month.December; if (allMonths == Month.All) { Console.WriteLine("All flags sets!"); } } [Flags] enum Month { None = 0, January = 1 << 0, June = 1 << 1, July = 1 << 2, August = 1 << 3, November = 1 << 4, December = 1 << 5, All = ~(~0 << 6) } |
Починаючи з C# 7.0 ви можете використовувати двійкові літерали, які, ймовірно, більш інтуїтивно зрозумілі для читання:
1 2 3 4 5 6 7 8 9 10 11 12 |
[Flags] enum Month { None = 0b0000, January = 0b0001, June = 0b0010, July = 0b0100, August = 0b1000, All = 0b1111 } |