为什么 StringSplitOptions 在 C# 中标记有 Flags 属性?

Why is StringSplitOptions tagged with the Flags attribute in C#?

我正在查看应用于它的 StringSplitOptions enum and and then was surprised to see it has the Flags 属性的摘要。

Flags 枚举与 BindingFlags 之类的事情相关,您可以在其中执行 BindingFlags.Public | BindingFlags.NonPublic 之类的事情,但在 StringSplitOptions 的情况下使用 StringSplitOptions.None | StringSplitOptions.RemoveEmptyEntries 不会看起来不正确。

那么在像 StringSplitOptions 这样只有两个不同值的枚举上使用 Flags 属性的原因是什么,其中一个是 "no value" (None) ?

StringSplitOptions 在概念上是一个标志枚举,即使它现在只有一个标志 .

将来,他们可能会在 StringSplitOptions 中添加更多选项。这些新选项将作为标志添加,您可以将它们与 RemoveEmptyEntries.

结合使用

所以,先发制人地把StringSplitOptions标记为[Flags]是有意义的。

有了 [Flags] 信号,你应该测试

   StringSplitOptions sso;
   if (sso.HasFlag(StringSplitOptions.RemoveEmptyEntries))
   ....

而不是

   if (sso == StringSplitOptions.RemoveEmptyEntries)

后一个测试将失败,以防他们添加更多标志。 像 Resharper 这样的代码工具可能会对此进行检查(我还没有尝试过)并将后一个版本标记为危险。

尽管在今天,它们是完全等价的。

这是类型设计师给类型用户的消息。 如果他们添加更多枚举值,他们会将其编号为 2、4、8,而不是 2、3、4。 此信息必须保存在某个地方。