【问题标题】:Enum with flag and Bitwise operation带有标志和按位运算的枚举
【发布时间】:2016-08-31 06:26:46
【问题描述】:

我有一个 senario,我正在使用下面的枚举来做同样的事情

[Flags]
enum State
{
    None = 0x00,
    Added = 0x01,
    Edited = 0x02,
    Commented = 0x04,
    Uncommented = 0x8,
    Reordered = 0x16
}

我想得到这样的结果

如果添加的结果是

添加

如果那么编辑结果将是

添加、编辑

如果那么 Reordered 将是

添加、编辑、重新排序

如果那么评论将是

添加、编辑、重新排序、评论

如果那么 Uncommented 将是

已添加、已编辑、已重新排序、已注释、未注释

如果那么评论将是

已添加、已编辑、已重新排序、已评论、未评论、已评论

等等。

请告知我是否可以使用任何Bitwise 操作来做同样的事情。

【问题讨论】:

  • 听起来你真的不想要按位标志,如果你实际上不能单独设置每个部分......
  • 你不能在一个变量中多次存储相同的标志值,你需要创建一个List<State>然后你可以删除标志语义
  • 我喜欢这些值,尤其是 0x16 :)

标签: c# enums flags


【解决方案1】:

您的两个要求使得不可能为此目的使用按位标志枚举。

  • 无法表示设置位的顺序。
  • 没有办法表示一个位被设置多次。

使用按位标志枚举时,所有这些操作都无法区分:

Added, Edited, Reordered
Added, Reordered, Edited
Added, Edited, Reordered, Edited

它们都表示为Added | Edited | Reordered

如 cmets 中所述,您应该改用 List<State> 来表示此数据。

【讨论】:

  • 而且,正如 cmets 中所提到的,Reordered 在这个标志枚举中具有欺骗性,因为它总是设置 EditedCommented 的位(因为使用十六进制表示法,下一个位值应该是0x10,而不是0x16)
猜你喜欢
  • 2018-04-20
  • 2011-04-01
  • 1970-01-01
  • 2022-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多