Я понимаю, как Перечисления работают в 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
}
Основное преимущество с первым в том, что вы Не нужно рассчитать правильные значения для каждого флага, так как компилятор сделает это для вас. Кроме того, они одинаковы.
Рассмотрим более сложные образцы:
[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
afaik Его дебаты чтения. Некоторые скажут, что первый гораздо читабелен, потому что у вас есть фактический индекс флага на правой стороне «<<».