三值逻辑与可空的 bool?

4

我有一个简单的控件,一开始没有选择,用户可以决定设置为。总的来说,这是三值逻辑的标准示例。

我的第一个想法是使用可空布尔值进行持久化。通常,这会导致一些烦人的if (var == null) { ... }(或类似的内容)。

第二个想法是使用枚举。

public enum Selection
{
   Yes,
   No,
   NotChoosenYet
}

在我的情境下,这会涉及到一些枚举到布尔值的转换,但这并不是一个致命问题。
总的来说,我倾向于选择“枚举方式”,因为它更易读。 我在 Stack Overflow 上搜索了一段时间,但找不到一个能帮我进一步了解的问题。
还有其他更好的方法吗?也许有标准的 .Net 类型可以使事情更容易?

1
如果在使用布尔变量等时不使用有意义的变量名称,枚举将会更易读。然而,什么让人烦恼的是空值检查?这是标准流程。 - Grant Thomas
那么枚举类型 enum 怎么比可空布尔类型 bool? 更好呢?你总是需要使用一些 if 语句。 - H H
我知道很多代码都有很多if(var == null)检查,导致代码本身变得比应该更混乱(或更大)。也许这就是我不喜欢null的原因。 - Micha
@Micha,if (selection == Selection.NotChoosenYet) { ... 这种写法比较冗长。而使用 switch 更加啰嗦。 - Grant Thomas
http://wpf.2000things.com/2011/07/29/353-binding-a-three-state-checkbox-to-a-nullable-bool/ - phillip
3个回答

3

我建议使用枚举。

以下是我能够立刻想到的三个原因:

  1. 它更易读。
  2. 你可以避免空指针和不必要的空检查代码。
  3. 你可以添加另一个选项(例如“稍后再问”)而无需重构整个源代码。

在我的(特殊)情况下,你的论点是最合适的。 - Micha

2
我建议使用可空布尔值,因为这是在数据库中表示它的方式。
可以是NULL、Yes或No。
引用自可空类型(C#编程指南)
可空类型是Nullable结构体的实例。可为空的类型可以表示其基础值类型的正确值范围以及额外的null值。例如,一个可空的Int32可以赋任何从-2147483648到2147483647的值,也可以赋null值。一个可空的类型可以被赋值为true、false或null。当你处理可能没有被赋值的元素的数据库和其他数据类型时,将null分配给数值和布尔类型尤其有用。例如,数据库中的布尔字段可以存储true、false的值,或者它可能未定义。
另外来自使用可空类型
对于什么时候使用可空类型的例子,可以考虑一个普通的布尔变量只能有两个值:true和false。没有任何值代表“未定义”。在许多编程应用程序中,尤其是在数据库交互方面,变量可能处于未定义状态。例如,数据库中的字段可能包含true或false的值,但它也可能根本没有任何值。类似地,引用类型可以设置为null表示它们未初始化。

这没问题。最终(在保存到数据库之前),用户必须选择“是”或“否”。 - Micha
感谢您添加了MSDN信息(+1)。有趣的是,考虑到可空布尔值将是“微软选择”。在我的情况下,我不使用数据库来存储数据,但我会考虑这个建议。 - Micha

1
我会模仿数据库中的存储方式。如果在数据库中是null、true和false,那么在c#代码中使用null、yes和no。如果在数据库中是undecided、yes和no,则在c#代码中使用枚举。这样做是因为这样对下一个人更简单。如果要在这两者之间选择,枚举看起来更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接