使用[Flags]属性定义C#枚举的多种方法?

Nat*_*ate 6 .net c# enums flags

我理解Enums如何在C#中工作,我得到了Flags属性带给表的内容.

我在这里看到了这个问题.推荐第一种口味,但没有提供任何理由/理由.

这两个定义的方式有什么不同,一个比另一个好吗?使用第一个synax代替第二个synax有什么好处?在定义Flags类型Enums时,我总是使用第二种风格......我一直都在做错吗?

[Serializable]
[Flags]
public enum SiteRoles
{
    User = 1 << 0,
    Admin = 1 << 1,
    Helpdesk = 1 << 2
}
Run Code Online (Sandbox Code Playgroud)

那是不一样的

[Serializable]
[Flags]
public enum SiteRoles
{
    User = 1,
    Admin = 2,
    Helpdesk = 4
}
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 6

第一个的主要优点是您不需要为每个标志计算正确的值,因为编译器会为您执行此操作.除此之外他们是一样的.

  • 是的,1 << n是一个常量,所以编译器应该计算它比1,2,4,8更容易出错...你也可以使用十六进制,例如0x1,0x10,0x100 ...... (2认同)

Ser*_*kov 6

考虑更复杂的样本:

[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
}
Run Code Online (Sandbox Code Playgroud)

此示例显示在这种情况下,第一个版本更具可读性.十进制文字不是表示标志常量的最佳方式.有关按位运算的更多信息(也可用于表示标志常量),请参阅http://en.wikipedia.org/wiki/Bitwise_operation