7

我了解枚举在 C# 中是如何工作的,并且我了解了 Flags 属性带来的东西。

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

这两者的定义方式是否有区别,一个比另一个好?使用第一个语法而不是第二个语法有什么好处?在定义 Flags 类型 Enums 时,我总是使用第二种风格......我一直都做错了吗?

[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
}
4

3 回答 3

6

第一个的主要优点是您不需要为每个标志计算正确的值,因为编译器会为您完成。除此之外,它们是相同的。

于 2010-01-25T17:36:07.153 回答
6

Consider more complex samples:

[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
}

This samples shows that in this case first version is MUCH MORE readable. Decimal literals is not the best way to represent flag constants. And for more information about bitwise operations (that also can be used to represent flag constants) see http://en.wikipedia.org/wiki/Bitwise_operation

于 2010-01-25T18:54:36.147 回答
0

AFAIK 这是一场可读性辩论。有人会说第一个更具可读性,因为您在“<<”右侧有标志的实际索引。

于 2010-01-25T17:34:31.317 回答