我有点装腔作势,我不确定答案是什么。
基本上,在三态数据类型中使用什么值有约定吗?在谷歌上搜索,看起来并没有:我看到了:
- -1=假,0=未知/未定义,+1=真
- 0=假,+1=真,+2=未知/未定义
- -1=未知/未定义,0=假,+1=真
除其他外。如果有的话,我宁愿用一个众所周知的惯例。否则我会编造一个:-)很可能没有正确的答案,但我只是想再深入一点。。。
编辑
也发现了微软似乎在最近的代码中使用的这个:-1=true,0=false,2=未知。我认为2==未知意味着当只查看调试器/转储/内存等中的原始值时,它消除了解释+1/-1的歧义。奇怪的是,这个选项仅出于这个原因就很有吸引力(消除了忘记1的哪个变体表示"true"的机会)。
据我所知,这方面没有惯例。
布尔值甚至没有单一的约定,最常见的是:
- 0=假,-1=真
- 0=假,1=真
另一个相关的常见(但不是通用)约定是对未定义值使用-1。
如果您选择使用-1表示未定义,则可以使用0/1表示False/True:
- -1=未定义
- 0=错误
- 1=真
当然,我必须提到的是,第三种状态当然不应该是未定义/未知的,而是FileNotFound。)
不管你附加的语义是什么,我都会选择你的三个值作为一个负数、一个正数和零。这允许仅使用单个测试和分支(>0,<0,==0,>=0,<=0,!=0)对3个可能值的每个可能的1-或2-元素子集的成员资格进行最佳测试。
我想说没有什么比约定更好的了,但我更喜欢你提到的第三种情况,因为我已经在使用中看到过很多次了。
Value State
---------- ----------
-1 Undefined
0 False
+1 True
我不喜欢前两种情况,因为纯布尔状态大多被确定为0 = False
和0 <> True
,所以这可能有点令人困惑。
如果您正在寻找一个带int的三态布尔的替代品,那么您总是可以拥有可为null的布尔值,而不必担心标准问题。类似于,在C#bool? triState
中。它可以有true、false或null值,这些值可以被认为是未知的——但我知道这不是你想要的。
我不了解惯例。从这里给出的答案来看肯定不是。我喜欢你的第三个。
但从另一个角度来看,我的选择是:
{ True, Unknown, False } => 0, 1, 2 // going by enum like values...
编辑:在@LarsTech讲了一个好的观点之后,我应该澄清一下。如果我知道一个变量可以有两个以上的值,那么我会认为它是一个枚举,因此我可以将其转换为{0,1,2}。对于枚举值,我总是遵循这样的模式:"好,好,差"。这对我来说很自然,但对许多人来说,拥有"0"是不受欢迎的。一个人总是可以有相反的顺序。