【问题标题】:nullable bool in if() statement - checks required?if() 语句中的可为空的布尔值 - 需要检查吗?
【发布时间】:2013-11-25 15:50:19
【问题描述】:

我刚刚在同事代码中遇到了这个问题。他有一个可以为空的 bool 类型,他这样比较:

//foo has no value here and evaluated to false
if(foo==true)
{
    doSomething();
}

通常,我检查可空布尔值的方式是这样的:

bool IsTrue(bool? value)
{
   return value.HasValue && value.Value;
}

if(IsTrue(foo)){
   doSomething()
}

编辑:我运行了这两种方法,它们看起来都以相同的方式工作。我在问哪种方法是正确的,是否需要额外的检查??

现在我在质疑自己和同事的代码。我在这里做这个额外的检查有什么意义吗?或者我可以通过第一种方式安全地做到这一点吗?

谢谢(是的,我确实搜索过这个!:))

【问题讨论】:

  • 为什么不自己尝试一下呢?在单元测试或例如 LINQPad 中。
  • @Honza 我知道这两种说法都有效。我在问哪一个是正确的使用
  • 公平地说,我会质疑是否需要一个可为空的布尔值。大多数情况下,事情要么是真要么是假,它不是“中间”或“半真半假”。
  • 对我来说,if(foo) 不起作用。编译器说:“不能隐式转换类型'bool?'到 'bool'。存在显式转换(您是否缺少演员表?)"
  • @Arran 通常情况下,某些东西可以是true、false 或unknown。

标签: c# nullable


【解决方案1】:

其实我不建议你把null当成false。要么使用不可为空的布尔值,要么显式处理 null 值。另一种选择:

if (foo ?? false)
{

}

【讨论】:

  • 谢谢。我喜欢这个。不过,这将始终与 if(foo==true) 做同样的事情,对吗?我意识到它让用户更清楚地知道它可能有一个空值。但在功能方面,它是一样的吗?
  • @dferraro 从性能方面来看,最有效的将是HasValue && Value 调用或GetValueOrDefault()。但是空合并运算符和与布尔值比较都使用GetValueOrDefault() 和额外的HasValue 调用(在.Net 4.5 上检查)。我倾向于编写可读代码而不是过早地进行优化,所以我会选择foo ?? false 或foo.HasValue && foo.Value。 GetValueOrDeault() 也是不错的选择,但是foo == true 让我停下来思考一下,这是我在阅读代码时不喜欢做的事情
【解决方案2】:

我会用这个。

bool IsTrue(bool? value)
{
   return value.GetValueOrDefault();
}

只有当 null 或 false 和 true 有值和 true 时才会返回 false。

注意:你不能在if statement 中使用bool?,就像声明requires 任何可以隐式转换为Boolean 的东西。其中bool? 不能转换为布尔值,所以编译器会报错。

【讨论】:

  • @lazyberezovsky 这很好,但我发现与true 相比更明确,因此更好。在这里您需要记住默认值是什么 - 因此它不太明确。
  • @BartoszKP 所以你的意思是你不知道bool 的默认值是什么?还是有人不知道?我不这么认为..
  • @SriramSakthivel 不。我的意思是我所说的,只有这个。它不那么明确,仅此而已。我(或读者)知道与否无关紧要:)
  • 谢谢。我喜欢这个。不过,这将始终与 if(foo==true) 做同样的事情,对吗?我意识到它让用户更清楚地知道它可能有一个空值。但在功能方面,它是一样的吗?
  • 如果您不想依赖bool 的默认值,您可以使用overload of this method 并指定您的默认值。
【解决方案3】:

您可以通过检查值是否为true 来简化此操作,如下所示:

bool IsTrue(bool? value)
{
   return value == true;
}

这也适用于nulls,返回false。

我更喜欢使用这种检查“内联”,没有额外的功能,因为它简短而干净:

if(foo == true){
   doSomething()
}

【讨论】:

    【解决方案4】:

    因为这不会编译

    namespace ConsoleApplication1
    {
    class Program
    {
        static void Main(string[] args)
        {
            bool? test = null;
            if (test)
            {
                Console.WriteLine("ok");
            }
            Console.ReadKey();
        }
    }
    }
    

    我会做类似的事情

    class Program
    {
        static void Main(string[] args)
        {
            bool? test = null;
            if (test ?? false)
            {
                Console.WriteLine("ok");
            }
            Console.ReadKey();
        }
    }
    

    但是有一百万种方法可以做到这一点,所以选择一个并坚持下去:-)

    【讨论】:

    • 是我的伪代码中的一种类型。真正的代码说 if(foo==true).. 谢谢!
    【解决方案5】:

    你必须先检查 bool 是否有值。

    我会按照你最初的建议去做:

    value.HasValue && value.Value
    

    因为阅读代码的人最清楚。

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2013-03-01
      • 2021-11-08
      • 1970-01-01
      • 2015-05-25
      • 2021-08-03
      • 1970-01-01
      • 2023-03-29
      • 2023-01-25
      相关资源
      最近更新 更多