使用可为空的布尔值来存储三态值有什么优点吗?例如,
null == 1st state, false == 2nd state, true == 3rd state
?
开销可能比使用字节枚举更高,但我很好奇。
这是一个有点主观的问题,但我会说不,因为它会影响可读性。
在 bool 类型的末尾使用
?
标记,该类型是包含可为空 bool 的结构。
bool? mytristatebool = null;
没有
我建议使用Enum,因为你现在已经掌握了 3 个状态,并且随着范围的蔓延,它可能会进一步增加。因此,枚举将是一个安全的选择,并且对于描述三种状态更精确/可读,最重要的是第三种状态,它既不正确也不错误。
最后它更像是为眼睛编码,他们稍后会查看这段代码并使其对他们来说有意义且可读
我相信这样做是错误的。
布尔值是“两种状态”类型。这是它的定义。
在 C#、C++、Java 或其他语言中。
如果你想模拟三种状态,只需实现一个枚举即可,而不是重新发明一个方轮!
如果是WinForms程序,那么一种可能是使用System.Windows.Forms.CheckState。它具有“已检查”、“不确定”和“未检查”值 - 这可能适合也可能不适合您的目的。
一个更简单的解决方法是使用两个布尔变量。 一个将保留 null/not-null 另一个将保持 true/false
此的应用:
当您在布尔属性中缓存计算时,您需要知道它是否已经设置。
例如
// actual variable having true/false
private bool isX = false;
// variable holding wither above is set/not-set i.e. null/not-null
private bool isXSet = false;
public bool IsX
{
get
{
if (isXSet)
{
return isX;
}
else
{
isX = GetX(); // this could be time consuming.
isXSet = true;
return isX;
}
}
}
当上面的 GetX() 非常耗时并且 IsX 被多次访问时,这在性能调整中变得非常有用。
对于未知或尚未确定的情况,我会坚持为零。您也失去了对这些值进行数学计算的可能性。总而言之,我认为这不是一个好主意
这要看情况。 非常适合“有狗”这样的属性:对、错,或者我们只是不知道。
我明白为什么人们建议不要用它来表示选项 A、B 和 C。我也会使用枚举。
但是布尔?非常适合表示可能尚未获取或生成的实际布尔值。不,有一个单独的 bool 来获取并不简单,而是更混乱。恕我直言
现在,如果只有 C# 允许局部静态变量,那么我们就可以使其完全独立,如下所示:
bool isSomething{
get{
static bool? _isSomething = null;
if (null == _isSomething){
_isSomething = goFetchIsSomething();
}
return _isSomething == true;
}
}
但是由于纯粹主义者讨厌可读的代码,你能做的最好的就是这个
private bool? _isSomething = null; //Pretty please don't try to use me outside of isSomething
bool isSomething{
get{
if (null == this._isSomething){
this._isSomething = goFetchIsSomething();
}
return this._isSomething == true;
}
}
我确实认为在必须传递信息(无论某些条件是真是假)的情况下使用
bool?
有一些价值,但“未决定”也是一种可能性。
例如,考虑一个代表数字的类型
EstimatedNumber
,但附加了误差范围,您可以使用它进行数学计算,同时自动记录结果的精确度。您可以为这种类型配备一个比较运算符 static bool? operator <(EstimatedNumber a, EstimatedNumber b)
,如果 atrue
肯定为假,则报告 false
,如果数字的误差范围重叠,则报告 null
,因此无法确定一个不管怎样。