Проверьте, не установлены ли все значения Enum - PullRequest
1 голос
/ 14 июля 2011

Возможно ли с помощью ONE-Liner (иначе обычным способом ...) проверить, установлены ли какие-либо из всех возможных состояний перечисления?

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

Как я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 14 июля 2011

Будет:

myFlags == 0

Достаточно? 0 означает, что биты не установлены, при условии, что вы используете флаги и ничего не делаете со значениями.

Учитывая это перечисление:

[Flags]
enum Fruit
{
    Forbidden = 0,
    Apple = 1,
    Orange = 2,
    Banana = 4
}

И этот код:

Fruit f = Fruit.Apple | Fruit.Banana;

if (f == 0)
    MessageBox.Show("what?");

f = Fruit.Forbidden;

if (f == 0)
    MessageBox.Show("expected");

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

Дано:

[Flags]
enum Fruit
{
    Apple = 1,
    Orange = 2,
    Banana = 4
}

И

Fruit f = Fruit.Apple | Fruit.Banana;

if (f == 0)
    MessageBox.Show("what?");

f = f & ~Fruit.Apple & ~Fruit.Banana;

if (f == 0)
    MessageBox.Show("expected");

Так же ведет себя.

4 голосов
/ 14 июля 2011
[Flags]
enum Fruit
{
    None,
    Apple  /* = 1*/,
    Orange    = Apple << 1,
    Banana    = Orange << 1,

    All       = (Banana << 1) -1
}

Таким образом, вы можете проверить, установлены ли

  • флажки с фруктами: value == Fruit.None
  • установлены все флажки с фруктами: value == Fruit.All
  • установлены недопустимые значения фруктов: (value & ~Fruit.All) != 0

См. Это на IdeOne

1 голос
/ 14 июля 2011

Я бы порекомендовал, чтобы перечисление содержало элемент по умолчанию, не установленный, такой как Fruit.None со значением 0 или 0x0. Таким образом, любой «не установленный» элемент с типом enum Fruit может быть установлен по умолчанию на Fruit.None.

public enum Fruit
{
    None,
    Banana,
    Apple,
    Kumquat,
}

И

public class Meal
{
    Fruit myFruit = Fruit.None;
}
1 голос
/ 14 июля 2011

Если вы говорите о перечислении, настроенном как битовые флаги, MSDN имеет хороший пример :

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}

, чтобы проверить, установлен ли битовый флаг, вы могли бы,например, сделайте следующее:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;

Теоретически вы можете поместить все свои побитовые операции в одну строку, разделенную & или | в зависимости от вашего намерения.

...