Несколько способов определить Перечисления C# с [Флагами] атрибут?

Я понимаю, как Перечисления работают в C#, и я получаю то, что атрибут Флагов приносит к таблице.

Я видел этот вопрос, здесь. Который рекомендует первую разновидность, но не обеспечивает причины/выравнивания ее.

Существует ли различие в пути, которым определяются эти два, один лучше, чем другой? Что преимущества к использованию первого synax как вместо второго? Я всегда использовал вторую разновидность, когда определение Флагов вводит Перечисления... я делал его неправильно все это время?

[Serializable]
[Flags]
public enum SiteRoles
{
    User = 1 << 0,
    Admin = 1 << 1,
    Helpdesk = 1 << 2
}

Это не то же как

[Serializable]
[Flags]
public enum SiteRoles
{
    User = 1,
    Admin = 2,
    Helpdesk = 4
}

6
задан Community 23 May 2017 в 11:58
поделиться

3 ответа

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

6
ответ дан 9 December 2019 в 20:43
поделиться

Рассмотрим более сложные образцы:

[Flags]
public enum SiteRoles
{
    User = 1 << 12,
    Admin = 1 << 13,
    Helpdesk = 1 << 15,
    AdvancedUser = User | Helpdesk, //or (1<<12)|(1<<13)
}

[Flags]
public enum SiteRoles
{
    User = 4096, //not so obvious!
    Admin = 8192,
    Helpdesk = 16384,
    AdvancedUser = 12288, //!
}

[Flags]
public enum SiteRoles
{
    User = 0x1000, //we can use hexademical digits
    Admin = 0x2000,
    Helpdesk = 0x4000,
    AdvancedUser = 0x3000, //it much simpler calculate binary operator OR with hexademicals
}

Эти образцы показывают, что в этом случае первая версия гораздо более читаемой. Десятичные литералы - не лучший способ представлять флаг-константы. И для получения дополнительной информации о побитовых операциях (которые также могут быть использованы для представления постоянных флага) см. http://en.wikipedia.org/wiki/bitsise_operation

6
ответ дан 9 December 2019 в 20:43
поделиться

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

0
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: