我正在查看StringSplitOptions enum的摘要,然后惊讶地发现它应用了Flags属性。
Flags 枚举与BindingFlags
之类的事情相关,你想做BindingFlags.Public | BindingFlags.NonPublic
之类的事情,但在StringSplitOptions
的情况下,使用StringSplitOptions.None | StringSplitOptions.RemoveEmptyEntries
看起来不正确。
那么在像StringSplitOptions
这样的枚举上使用Flags
属性的原因是什么,它只有两个不同的值,其中一个是"无值"(None(?
StringSplitOptions
在概念上是一个标志枚举,即使它现在只有一个标志。
将来,他们可能会向StringSplitOptions
添加更多选项。这些新选项将添加为标志,您可以将它们与RemoveEmptyEntries
.
因此,先发制人地用[Flags]
标记StringSplitOptions
是有意义的。
用 [标志] 发出信号,你应该测试
StringSplitOptions sso;
if (sso.HasFlag(StringSplitOptions.RemoveEmptyEntries))
....
而不是
if (sso == StringSplitOptions.RemoveEmptyEntries)
后一个测试将失败,以防他们添加更多标志。 像Resharper这样的代码工具可能会检查这一点(我还没有尝试过(,并将后一个版本标记为危险。
虽然对于今天来说,它们是完全等价的。
这是类型设计器发给类型用户的消息。 如果他们添加更多的枚举值,他们将编号为 2,4,8,而不是 2,3,4。 这些信息必须保存在某个地方。