Должны ли флаги перечисления C # быть последовательными - PullRequest
7 голосов
/ 08 февраля 2012

В C # флаги enum должны быть последовательными?или вы можете оставить пробелы?и все же выполнять побитовые сравнения?То есть, вы можете сделать следующее:

[Flags]
public enum MyEnum
{
    None = 0,
    IsStarred = 1,
    IsDone = 128
}

Ответы [ 8 ]

7 голосов
/ 08 февраля 2012

Нет ничего, что требовало бы, чтобы они были последовательными.

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

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

5 голосов
/ 08 февраля 2012

Нет ничего плохого в коде, который вы опубликовали.Это абсолютно нормально:

[Flags]
public enum MyEnum
{
    None = 0,
    IsStarred = 1,
    IsDone = 128
}

И вот так:

[Flags]
public enum MyEnum
{
    IsStarred = 1,
    IsDone = 128
    None = 0,
    SomethingElse = 4,
}

Просто помните, что FlagsAttribute не обязывает ваши значения быть битовыми масками.

4 голосов
/ 08 февраля 2012

Они не должны быть последовательными.

4 голосов
/ 08 февраля 2012

Нет такого требования.То, что у вас есть, хорошо, если вы используете заглавные буквы [Flags].

3 голосов
/ 08 февраля 2012

Да, вы можете сделать это.Это зависит от вас.

1 голос
/ 08 февраля 2012

Мало того, что вы можете сделать это, но вы также можете сделать это:

public enum MyEnum
{
    None,
    IsStarred,
    IsDone = 128
}

или

public enum MyEnum
{
    None = 5,
    IsStarred,
    IsDone = 128
}

вот ссылка на другие примеры: http://www.dotnetperls.com/enum

1 голос
/ 08 февраля 2012

Нет, они не должны быть последовательными.Скомпилируйте свой код и убедитесь сами

0 голосов
/ 08 февраля 2012

Перечисления Squental не нуждаются в атрибуте Flags.Но это лучшая практика.Вы можете прочитать больше здесь: http://msdn.microsoft.com/en-us/library/ms229062.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...