为什么 StringSplitOptions 在 C# 中使用 Flags 属性进行标记?



我正在查看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。 这些信息必须保存在某个地方。

最新更新