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

时间:2011-03-16 10:21:09

标签: c# state boolean

使用可空的bool存储三态值是否有任何优点?例如,null == 1st state, false == 2nd state, true == 3rd state

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

9 个答案:

答案 0 :(得分:16)

您应该获得Framework Design Guidelines的副本。

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

其中一点是:

  • 不要使用布尔值,除非您绝对确定不会需要超过两个值。

答案 1 :(得分:15)

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

答案 2 :(得分:4)

我认为这样做是错误的。

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

在C#,C ++,Java等等。

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

答案 3 :(得分:2)

我建议去 Enum ,因为你现在手头已经有3个状态了,并且范围蔓延可能会进一步增加。因此,Enum将是一个安全的赌注,更准确/可读用于描述三个州,最重要的是第三个既不是真也不是假的。

最后,它更像是对眼睛进行编码,后者会对此代码进行后续处理并使其具有意义和可读性

答案 4 :(得分:2)

在bool类型的末尾使用?标记,这是一个包含可空bool的结构。

bool? mytristatebool = null;

答案 5 :(得分:1)

更简单的解决方法是使用两个布尔变量。 一个将保持null / not-null 而另一个将保持真/假

应用程序

当您在布尔属性中缓存计算时,您需要知道它是否已经设置。

e.g。

// 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时,这在性能调优中非常有用。

答案 6 :(得分:1)

如果它是一个WinForms程序,那么一种可能性就是使用System.Windows.Forms.CheckState。它具有Checked,Indeterminate和Unchecked的值 - 这可能适合您的目的,也可能不适合。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

这取决于。非常适合像'Has Dog'这样的房产:真,假,或者我们只是不知道。