标志属性是否必要?

10
我发现无论是否使用 flags 属性,如果定义了以下枚举,则可以进行位操作。
enum TestType
{
    None = 0x0,
    Type1 = 0x1,
    Type2 = 0x2
}

我在想为什么我们需要flags属性?



可能是Enum Flags Attribute的重复问题。 - BoltClock
1
实际上,我不认为这是一个重复的问题;那个重复的问题没有涉及到为什么需要它;所有的例子都可以用同样的方式工作。 - Marc Gravell
2
@Marc:嗯,我刚才看了一些答案,你说的有道理。 - BoltClock
2个回答

18

无论哪种方式,C#都会将它们视为相同,但C#并不是唯一的使用者:

  • PropertyGrid 会以不同的方式渲染它,以允许组合
  • XmlSerializer 根据此标志接受或拒绝分隔的组合
  • Enum.Parse(从字符串转换)也是如此,并且枚举的.ToString()行为不同
  • 许多其他显示或处理值的代码将对它们进行不同的处理

更重要的是,它是向其他开发人员(和代码)表达意图的表达式:这意味着应该将其视为组合,而不是排他值


可能要提到ToString作为一种特别常见的操作吗? - Jon Skeet

1
有时候,枚举值的位组合是有意义的(比如FileAccess - 读、写、读写),有时候则不是(通常情况下)。因此,[Flags] 是一种描述性的方式,用于在元数据中存储位操作在该枚举类型上是“有意义的”信息。这个属性有几个消费者,例如该枚举的ToString方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接