为什么我永远不会在标志枚举中使用0

Pas*_*cal 3 c# enums flags

可能重复:
Enum应该以0还是1开头?

为什么我永远不会在标志枚举中使用0?我现在已多次阅读此内容并想知道原因:)

Hen*_*man 21

因为Flag枚举是位集合或选项集.

一个0值将是一部分的所有套,或根本没有.它只是行不通.

  • 显式的"无"命名值有时可能很有用. (7认同)
  • 要阐述@Henk的优秀答案:AnyNumber AND 0将始终等于0,ORing 0与任何数字都必须影响数字(总是等于自己) (2认同)

Eri*_*ert 18

为什么我永远不会在标志枚举中使用0?

这个问题是基于一个不正确的假设.您应该始终在标志枚举中使用零.它应始终设置为"无".

除了表示"没有设置任何标志"之外,你不应该使用它.

为什么不?

因为如果零具有除"无"之外的含义,它会变得非常混乱.一个人有一个合理的期望,((e & E.X) == E.X)意思是"X标志设置了吗?" 但如果X为零,则此表达式将始终为true,即使逻辑上该标志未设置为"set".


Jas*_*ams 5

尽管零意味着没有设置任何位,但为 0 指定一个命名常量通常非常有用。

当我设置标志字时,我定义了位的名称,以便它们都代表非默认值。也就是说,枚举值始终初始化为零,从而“关闭”位字段表示的所有选项。

这为您的枚举提供了前向兼容性,以便任何创建新值的人都知道,如果您稍后向位字段添加更多标志,则任何零位都可以“安全”使用。

同样,组合多个标志来创建新的常量名称也非常有用,这使得代码更具可读性。

这样做的危险(以及您引用的规则的原因)只是您必须意识到单个位值(标志)与表示位组或位组合的值之间的差异。