为什么StringSplitOptions在C#中被标记为Flags属性?
我正在查看枚举的摘要,然后惊讶地发现它应用了属性 Flags枚举与为什么StringSplitOptions在C#中被标记为Flags属性?,c#,enum-flags,C#,Enum Flags,我正在查看枚举的摘要,然后惊讶地发现它应用了属性 Flags枚举与BindingFlags相关,您可以在其中执行BindingFlags.Public | BindingFlags.NonPublic等操作,但在StringSplitOptions的情况下,使用StringSplitOptions.None | StringSplitOptions.RemoveEmptyEntries看起来不正确 那么,在像StringSplitOptions这样只有两个不同值的枚举上使用Flags属性的原因是
BindingFlags
相关,您可以在其中执行BindingFlags.Public | BindingFlags.NonPublic
等操作,但在StringSplitOptions
的情况下,使用StringSplitOptions.None | StringSplitOptions.RemoveEmptyEntries
看起来不正确
那么,在像
StringSplitOptions
这样只有两个不同值的枚举上使用Flags
属性的原因是什么呢?其中一个是“无值”(None)?StringSplitOptions
在概念上是一个标志枚举,即使它现在只有一个标志
将来,他们可能会向StringSplitOptions
添加更多选项。这些新选项将作为标志添加,您可以将它们与removemptyEntries
组合
因此,使用
[Flags]
StringSplitOptions
预先标记StringSplitOptions
在概念上是一个标志枚举,即使它现在只有一个标志也是有意义的
将来,他们可能会向StringSplitOptions
添加更多选项。这些新选项将作为标志添加,您可以将它们与removemptyEntries
组合
因此,有必要先用
[Flags]
标记StringSplitOptions
,用[Flags]发出信号,您应该进行测试
StringSplitOptions sso;
if (sso.HasFlag(StringSplitOptions.RemoveEmptyEntries))
....
而不是
if (sso == StringSplitOptions.RemoveEmptyEntries)
如果添加更多标志,后一个测试将失败。
像Resharper这样的代码工具可能会对此进行检查(我还没有尝试过),并将后一个版本标记为危险
尽管在今天,它们是完全等价的
它是从类型设计器发送给类型用户的消息。
如果他们添加更多的枚举值,则会将其编号为2,4,8,而不是2,3,4。
此信息必须保存在某个地方。如果[Flags]发出信号,您应该进行测试
StringSplitOptions sso;
if (sso.HasFlag(StringSplitOptions.RemoveEmptyEntries))
....
而不是
if (sso == StringSplitOptions.RemoveEmptyEntries)
如果添加更多标志,后一个测试将失败。
像Resharper这样的代码工具可能会对此进行检查(我还没有尝试过),并将后一个版本标记为危险
尽管在今天,它们是完全等价的
它是从类型设计器发送给类型用户的消息。
如果他们添加更多的枚举值,则会将其编号为2,4,8,而不是2,3,4。
这些信息必须保存在某个地方。这可能是一个错误,或者他们这样做是为了在将来添加新的值时保持向前兼容。我相信是后者。现在只有一种选择,但将来可能会有更多。@Sean“向前兼容”。。。但是它没有任何作用,除非你把它打印出来。这要么是一个错误,要么他们这样做是为了在将来添加新的值时保持向前兼容。我相信后者。现在只有一种选择,但将来可能会有更多。@Sean“向前兼容”。。。但是它没有任何作用,除非你把它打印出来。为什么需要先发制人的标记呢?用[Flags]声明枚举不是破坏性的更改,可以在任何时候或@RandRandom执行,为什么不现在执行呢,因为它在概念上是一个标志枚举?等待以后有什么意义?@RandRandom有些枚举是作为一组有限的选项编写的,有些是作为标志枚举编写的。这些在概念上是不同的。很明显,如果将更多成员添加到
StringSplitOptions
,它们将作为标志添加。因此,StringSplitOptions
在概念上是一个标志枚举。@RandRandomremovemptyentries
是一个布尔值——要么做,要么不做。您不会添加另一个您选择的选项,而不是removeMptyEntries
:限制用户删除空条目或执行不区分大小写的拆分(例如)是没有意义的。这不是EmptyEntryOptions
——它们是应用于字符串拆分整个过程的单个布尔选项。此外,名称是复数。接下来,这意味着它可能是一个标志枚举。为什么需要pre-emptiv标记?用[Flags]声明枚举不是破坏性的更改,可以在任何时候或@RandRandom执行,为什么不现在执行呢,因为它在概念上是一个标志枚举?等待以后有什么意义?@RandRandom有些枚举是作为一组有限的选项编写的,有些是作为标志枚举编写的。这些在概念上是不同的。很明显,如果将更多成员添加到StringSplitOptions
,它们将作为标志添加。因此,StringSplitOptions
在概念上是一个标志枚举。@RandRandomremovemptyentries
是一个布尔值——要么做,要么不做。您不会添加另一个您选择的选项,而不是removeMptyEntries
:限制用户删除空条目或执行不区分大小写的拆分(例如)是没有意义的。这不是EmptyEntryOptions
——它们是应用于字符串拆分整个过程的单个布尔选项。此外,名称是复数。接下来,这意味着它可能是一个标志枚举。