C # проблема с флагами - PullRequest
       11

C # проблема с флагами

2 голосов
/ 24 сентября 2011

У меня есть enum (флаг)

[Flags]
public enum DisplayMode
{
    None,
    Dim,
    Inverted,
    Parse,
    Italics,
    Bold
}

Я хочу присвоить переменной два флага, например:

var displayFlags = DisplayMode.Parse | DisplayMode.Inverted;

Однако при отладке и наведенииповерх этой переменной сразу же после ее присвоения она говорит: displayFlags - это DisplayMode.Dim | DisplayMode.Inverted.

Что я пропускаю / не понимаю?

Ответы [ 6 ]

9 голосов
/ 24 сентября 2011

Вы пропустили назначение значимых значений флагов, например:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}

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

Если вы не доверяете своемуВозможность удваивать значения, вы можете использовать битовое смещение:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim =      1 << 0,
    Inverted = 1 << 1,
    Parse =    1 << 2,
    Italics =  1 << 3,
    Bold =     1 << 4
}

Из документации FlagsAttribute:

Рекомендации для FlagsAttribute и Enum

  • Используйте пользовательский атрибут FlagsAttribute для перечисления только в том случае, если с числовым значением должна выполняться побитовая операция (И, ИЛИ, ИСКЛЮЧИТЕЛЬНОЕ ИЛИ).

  • Определите константы перечисления в степенях двух, то есть 1, 2, 4, 8 и т. Д.Это означает, что отдельные флаги в комбинированных константах перечисления не перекрываются.

...

4 голосов
/ 24 сентября 2011

По умолчанию перечисление присваивает последовательные значения членам.Итак, у вас есть:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 3,
    Italics = 4,
    Bold = 5
}

Это не работает для двоичных файлов / флагов.Так что вам нужно быть явным:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}
1 голос
/ 24 сентября 2011

Вы не предоставляете соответствующие значения для вашего перечисления при объявлении:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}
0 голосов
/ 24 сентября 2011

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

0001 = 0x01,
0010 = 0x02,
0100 = 0x04,
1000 = 0x08

и так далее ...

0 голосов
/ 24 сентября 2011

Вам необходимо определить значения перечисления как степени двух:

[Flags]
public enum DisplayMode
{
    None = 1,
    Dim = 2,
    Inverted = 4,
    Parse = 8,
    Italics = 16,
    Bold = 32
}

Более подробная информация здесь: http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx

0 голосов
/ 24 сентября 2011

Вам необходимо явно указать значения флагов.Как объявлено, Parse равен 3, что является Dim |Перевернутый.

Попробуйте

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1 << 0,
    Inverted = 1 << 1,
    Parse = 1 << 2,
    Italics = 1 << 3,
    Bold = 1 << 4
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...