Флаг enum путаница C#
Согласно моему коду 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 ответа
Вы можете указать значения для перечислений, это необходимо для случаев флагов:
[Flags]
enum MyFlags {
Alpha=1,
Beta=2,
Gamma=4,
Delta=8
}
что означает [Флаги] выше?
Это означает, что среда выполнения будет поддерживать побитовые операции со значениями. Не имеет значения значения, которые сгенерирует компилятор. Например, если вы делаете это
var x = MyFlags.Alpha | MyFlags.Beta;
с атрибутом Flags результат x.ToString()
является "Alpha, Beta
Msgstr "Без атрибута было бы 3. Также изменяется поведение при разборе.
РЕДАКТИРОВАТЬ: Обновлен с лучшими именами, и компилятор не жалуется, используя битовые операции для атрибута не-flags, по крайней мере, не C#3 или 4 (новость для меня).
Атрибут Flags указывает, что перечисление может рассматриваться как битовое поле; то есть набор флагов.
Атрибут Flags действительно влияет только на поведение / вывод методов ToString(), Parse() и IsDefined() в вашем перечислении.
Вы можете выполнять побитовые операции без использования атрибута Flags, если вы используете степени двух значений.
Прочитайте этот существующий вопрос (и ответы) для более подробного освещения.
[Flags]
не изменяет способ, которым компилятор присваивает значения каждому идентификатору, вы всегда должны убедиться, что каждое значение соответствует, независимо от того, содержит перечисление флаги или нет.
Он также не изменяет побитовые операции, которые компилятор разрешает перечислять.
Что он делает, так это изменяет поведение Enum.Parse
а также Enum.ToString
методы, чтобы поддерживать комбинации значений, а также отдельные значения, например "a, b, c"
,