Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么StringSplitOptions在C#中被标记为Flags属性?_C#_Enum Flags - Fatal编程技术网

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

为什么StringSplitOptions在C#中被标记为Flags属性?,c#,enum-flags,C#,Enum Flags,我正在查看枚举的摘要,然后惊讶地发现它应用了属性 Flags枚举与BindingFlags相关,您可以在其中执行BindingFlags.Public | BindingFlags.NonPublic等操作,但在StringSplitOptions的情况下,使用StringSplitOptions.None | StringSplitOptions.RemoveEmptyEntries看起来不正确 那么,在像StringSplitOptions这样只有两个不同值的枚举上使用Flags属性的原因是

我正在查看枚举的摘要,然后惊讶地发现它应用了属性

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
在概念上是一个标志枚举。@RandRandom
removemptyentries
是一个布尔值——要么做,要么不做。您不会添加另一个您选择的选项,而不是
removeMptyEntries
:限制用户删除空条目或执行不区分大小写的拆分(例如)是没有意义的。这不是
EmptyEntryOptions
——它们是应用于字符串拆分整个过程的单个布尔选项。此外,名称是复数。接下来,这意味着它可能是一个标志枚举。为什么需要pre-emptiv标记?用[Flags]声明枚举不是破坏性的更改,可以在任何时候或@RandRandom执行,为什么不现在执行呢,因为它在概念上是一个标志枚举?等待以后有什么意义?@RandRandom有些枚举是作为一组有限的选项编写的,有些是作为标志枚举编写的。这些在概念上是不同的。很明显,如果将更多成员添加到
StringSplitOptions
,它们将作为标志添加。因此,
StringSplitOptions
在概念上是一个标志枚举。@RandRandom
removemptyentries
是一个布尔值——要么做,要么不做。您不会添加另一个您选择的选项,而不是
removeMptyEntries
:限制用户删除空条目或执行不区分大小写的拆分(例如)是没有意义的。这不是
EmptyEntryOptions
——它们是应用于字符串拆分整个过程的单个布尔选项。此外,名称是复数。接下来,这意味着它可能是一个标志枚举。