[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на 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 } |