【问题标题】:Multiple ways to define C# Enums with [Flags] attribute?使用 [Flags] 属性定义 C# 枚举的多种方法?
【发布时间】:2010-01-25 17:29:58
【问题描述】:

我了解 Enums 在 C# 中是如何工作的,并且我了解了 Flags 属性带来的好处。

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

这两者的定义方式有什么不同,一个比另一个更好吗?使用第一个语法而不是第二个语法有什么好处?我在定义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
}

【问题讨论】:

  • 这两个代码片段生成的IL代码是一样的。
  • 在这段代码中发现错误:BackupOperator = 1073714824。您可以通过说 BackupOperator = 1 来避免错误
  • 感谢所有信息,我将使用第一种方法,因为除了最简单的情况外,它似乎更适合所有情况。

标签: c# .net enums flags


【解决方案1】:

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

【讨论】:

  • 是的,1
  • 尽管您可能对 0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80 等十六进制值更感兴趣。
【解决方案2】:

考虑更复杂的样本:

[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/Bitwise_operation

【讨论】:

    【解决方案3】:

    AFAIK 是一场可读性辩论。有人会说第一个更具可读性,因为您在'

    【讨论】:

    • 这不是编译器技巧。 Helpdesk = 1
    • 我想我认为这是在利用编译器,因此是编译器技巧。你的观点很好。
    猜你喜欢
    • 2010-09-05
    • 2019-06-30
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2022-06-18
    相关资源
    最近更新 更多