C# 中可空 bool 作为三态变量

问题描述 投票:0回答:11

使用可为空的布尔值来存储三态值有什么优点吗?例如,

null == 1st state, false == 2nd state, true == 3rd state

开销可能比使用字节枚举更高,但我很好奇。

c# state boolean
11个回答
23
投票

您应该获得一份框架设计指南

第 177 页有一章在枚举参数和布尔参数之间进行选择

其中一点是:

  • 请勿使用布尔值,除非您完全确定永远不需要两个以上的值。

18
投票

这是一个有点主观的问题,但我会说不,因为它会影响可读性。


10
投票

在 bool 类型的末尾使用

?
标记,该类型是包含可为空 bool 的结构。

bool? mytristatebool = null;

5
投票

没有

我建议使用Enum,因为你现在已经掌握了 3 个状态,并且随着范围的蔓延,它可能会进一步增加。因此,枚举将是一个安全的选择,并且对于描述三种状态更精确/可读,最重要的是第三种状态,它既不正确也不错误。

最后它更像是为眼睛编码,他们稍后会查看这段代码并使其对他们来说有意义且可读


4
投票

我相信这样做是错误的。

布尔值是“两种状态”类型。这是它的定义。

在 C#、C++、Java 或其他语言中。

如果你想模拟三种状态,只需实现一个枚举即可,而不是重新发明一个方轮!


3
投票

如果是WinForms程序,那么一种可能是使用System.Windows.Forms.CheckState。它具有“已检查”、“不确定”和“未检查”值 - 这可能适合也可能不适合您的目的。


1
投票

一个更简单的解决方法是使用两个布尔变量。 一个将保留 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 被多次访问时,这在性能调整中变得非常有用。


0
投票

对于未知或尚未确定的情况,我会坚持为零。您也失去了对这些值进行数学计算的可能性。总而言之,我认为这不是一个好主意


0
投票

这要看情况。 非常适合“有狗”这样的属性:对、错,或者我们只是不知道。


0
投票

我明白为什么人们建议不要用它来表示选项 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;
    }
}

0
投票

我确实认为在必须传递信息(无论某些条件是真是假)的情况下使用

bool?
有一些价值,但“未决定”也是一种可能性。

例如,考虑一个代表数字的类型

EstimatedNumber
,但附加了误差范围,您可以使用它进行数学计算,同时自动记录结果的精确度。您可以为这种类型配备一个比较运算符
static bool? operator <(EstimatedNumber a, EstimatedNumber b)
,如果 a
true
肯定为假,则报告 false,如果数字的误差范围重叠,则报告
null
,因此无法确定一个不管怎样。

© www.soinside.com 2019 - 2024. All rights reserved.