10

背景

在我正在编写的 C# 命令行应用程序中,一些参数具有“yes”和“no”作为可能值。

我使用如下所示的 Enum 类型存储他们的输入。

enum YesNo
{
     Yes,
     No
}

这很好 - 代码有效。那里没问题。

注意:是的,我可以将这些存储为 bool(这就是它过去的工作方式)。我的设计选择是明确说明用户做出的 Yes/No 选择,因为他们会在其他上下文中看到这个打印,我希望它更明显地选择是什么。

我的问题

  • 有一个名为“YesNo”的枚举似乎很奇怪 - 对于“是”和“否”值的枚举更好的名称有什么建议。

所以最后

我在 StackOverflow 的早期就问过这个问题。这不是假问题——我确实遇到过这种情况。我只是觉得用它看看社区会做什么会很好。因为它是,我承认一个有点奇怪的问题。

首先,感谢所有花时间回复的人。我试图用一个深思熟虑的结论来回报。

对答案的评论

切换到 bool。我理解你的动机,但我觉得我需要指出二元选择(我的意思是在任何两个值之间进行选择 - 活着/死去,已婚/未婚等)与布尔选择不同真假。我们发现程序员在是/否和真/假之间切换很容易——这很公平。如果在这种情况下我的选择是例如“Democrat”或“Replication”(我知道这是人为的例子),那么您会看到混淆或至少尴尬的可能性。我确实认为 bool 选项在这种情况下是有效的,但更少所以在其他二元选择中。

本地化- 重点。在我的具体情况下,这并不重要 - 这不是而且永远不会被本地化,但对于其他情况,这是需要考虑的事情。

超过三个选项- 事实上,后来我不得不添加第三个值来表示用户的有效(在我的应用程序中)条件,特别是没有做出选择。

有很多好的评论,谢谢大家!

4

17 回答 17

39

您说您不想使用 bool ,因为它将被打印出来供用户查看其他内容。这表明问题不在于storage,而在于display。无论如何将真/假呈现为是/否,但没有必要为它创建一个全新的类型。

编辑:除了建议您首先不要使用枚举之外,我强烈建议您如果确实使用枚举,请更改顺序或使用显式值。如果您最终将值视为整数,那么 Yes=0, No=1 将非常令人困惑。

于 2008-12-22T07:07:24.403 回答
12

我建议您使用一个名称来指示设置为是或否的值。

例如


public enum Married
{
    YES,
    NO
}
于 2008-12-22T12:35:29.390 回答
8

看到用于布尔值的枚举,我会感到困惑。你说:

注意:是的,我可以将这些存储为 bool(这就是它过去的工作方式)。我的设计选择是明确用户做出的是/否选择,因为他们会
在其他内容中看到这个打印,我希望它更明显选择是什么。

我看不出“是”或“否”比“真”或“假”更“明确”。

于 2008-12-22T07:03:32.290 回答
6

ResponseEnum 或 EResponse 或 UserResponse 取决于您的约定。

我不会将自己限制为仅是或否,因为将来您可能还想添加需要不确定响应的功能。

于 2008-12-22T07:05:59.600 回答
5

我想称之为:

enum Boolean
{
     Yes,
     No
}

不,等等,已经有一个内置的布尔类型可以使用。

如果您在这里使用枚举的唯一原因是因为可以方便地转换到您想要向用户显示的字符串/从字符串转换,那么当您做更复杂的事情时,您将在轨道上被咬得很厉害。模型与视图的分离将为您提供良好的服务。阅读 MVC 和/或 MVVM 模式。

我可能还建议使用一些自定义属性的简单布尔值来定义显示字符串来代替“true”和“false”可能就足够了。然后,您可以编写自己的 to/from 字符串方法来查找您的自定义属性。

于 2008-12-22T10:19:51.300 回答
4
  • 是 否
  • 选择
  • 二元选择

或者只使用布尔值。

于 2008-12-22T07:00:27.100 回答
3

我根本不会使用枚举,只需滚动您自己的类型转换器并使用布尔值。

于 2008-12-22T10:26:01.977 回答
2

我认为YesNo很好。考虑诸如“MB_OK”和“MB_YESNO”之类的东西......我知道它不是一种类型,但任何不言自明的东西都应该没问题。

于 2008-12-22T07:10:50.293 回答
2

除了是/否之外,是否还有其他选项。对于只有 2 个选项坚持使用布尔值。尝试单独修改显示区域

于 2008-12-22T07:12:13.240 回答
2

(幽默——不要把这当回事……)

我很惊讶没有人提出这个建议:

public enum UserWtf
{
    No,
    Yes,
    FileNotFound
}
于 2008-12-22T07:52:48.243 回答
2

我想显示布尔值存在问题。最好创建存储布尔值的简单包装器,以便您将它们显示为是/否或真/假。

于 2008-12-22T12:30:09.790 回答
1

EUserAction ?

您将其描述为一些用户操作。不过,您也可以更具体。该名称允许将来进行一些其他选择。(名称应该是选择的目的,而不是选择的目的)

但是,对于您的另一个微妙的问题:

因为他们会在其他情况下看到这个打印,我希望它更明显的选择是什么。

用户看到什么并不重要。数据模型可能与您呈现给用户的内容大不相同。一个布尔值就足够了。未来是否有可能采取更多行动?

于 2008-12-22T06:59:23.437 回答
1

我阅读了您更新的解释,但我仍然觉得这是一个糟糕的选择。布尔值正是为此目的而存在的。您有责任确保在“他们将在其他内容中看到此内容”时输出适当的文本这可能很简单:

Console.WriteLine(_("使用 Foo:") + (useFoo ? _("Yes") : _("No")));

同时仍然完全支持本地化。useFoo 当然是一个参数,告诉函数它是否正在使用 foo。:)

_ 是 gettext 函数 ( http://www.gnu.org/software/gettext/ ) 的缩写,可用于 C# ( http://www.gnu.org/software/automake/manual/gettext/C_0023 .html)。

于 2008-12-22T07:19:17.407 回答
1

当我需要这样的东西时,我会使用 Flag 这个词,如Flag.Yes,MarriedFlag.No等。

何时有用的示例:您知道今天只有 Yes 和 No 值,但您怀疑将来可能会有其他值(例如 Maybe)。

于 2012-02-01T04:54:06.047 回答
0

除非除了 Yes 和 No 之外还有其他值,否则我看不到这个枚举的意义。那只是一个布尔值。并且制作一个枚举,这样您就不必输入是或否似乎有点愚蠢。

于 2008-12-22T07:54:11.877 回答
0

使用 bool,结合 bool.TrueString 和 bool.FalseString 进行显示。

于 2008-12-22T19:13:45.700 回答
0

我将 OptionalBinaryFilter 用于:

是的,不,所有

但是如果你只有 Yes 和 No,似乎更适合在成员中使用 Boolean。

于 2017-11-23T11:30:28.753 回答