флаг enum путаница C # - PullRequest
       31

флаг enum путаница C #

3 голосов
/ 26 августа 2009

В соответствии с моим кодом a = 1, b = 2, c = 3 и т. Д. Я думал, что флаг сделает a = 1, b = 2, c = 4 и т. Д.

[Flags]
public enum someEnum { none, a, b, c, d, e, f, }

Как получить то, что я хотел (с = 4, е = 8)? и что означает [Flags] выше?

Ответы [ 4 ]

17 голосов
/ 26 августа 2009

Вы можете указать значения для перечислений, это необходимо для случаев флагов:

[Flags]
enum MyFlags {
  Alpha=1,
  Beta=2,
  Gamma=4,
  Delta=8
}

что означает [Флаги] выше?

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

var x = MyFlags.Alpha | MyFlags.Beta;

с атрибутом Flags результат x.ToString() равен "Alpha, Beta". Без атрибута было бы 3. Также изменяет поведение при разборе.

РЕДАКТИРОВАТЬ: Обновлено с лучшими именами, и компилятор не жалуется, используя побитовые операции с атрибутом не-flags, по крайней мере, не C # 3 или 4 (новости для меня).

1 голос
/ 26 августа 2009

Атрибут Flags действительно влияет только на поведение / вывод методов ToString (), Parse () и IsDefined () в вашем перечислении.

Вы можете выполнять побитовые операции без использования атрибута Flags, если вы используете степени двух значений.

Прочитайте этот существующий вопрос (и ответы) для более подробного охвата.

1 голос
/ 26 августа 2009

Flags Attribute указывает, что перечисление может рассматриваться как битовое поле; то есть набор флагов.

0 голосов
/ 26 августа 2009

[Flags] не изменяет способ, которым компилятор присваивает значения каждому идентификатору, вы всегда должны убедиться, что каждое значение соответствует, независимо от того, содержит перечисление флаги или нет.

Он также не изменяет побитовые операции, которые компилятор разрешает при перечислении.

Что он делает, так это изменяет поведение методов Enum.Parse и Enum.ToString, чтобы поддерживать комбинации значений, а также отдельные значения, например, "a, b, c".

...