为什么 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。
此信息必须保存在某个地方。
我正在查看应用于它的 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。 此信息必须保存在某个地方。