if()语句中可以为空的bool - 需要检查吗?

时间:2013-11-25 15:50:20

标签: c# nullable

我刚刚在同事代码中遇到过这个问题。他有一个可以自负的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()
}

编辑:我浏览了两种方法,它们看起来都是一样的。我问的是哪一个是正确的方法,如果需要额外的检查?

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

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

5 个答案:

答案 0 :(得分:8)

实际上,我不建议您将null视为false。使用非可空布尔值,或显式处理null值。还有一个选择:

if (foo ?? false)
{

}

答案 1 :(得分:6)

我会用它。

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

仅当nullfalsetrue具有值且true时才会返回false。

注意:您无法bool?中使用if statement,就像声明requires可以隐式转换为Boolean的任何内容一样。其中bool?不能转换为布尔值,因此编译器会抱怨。

答案 2 :(得分:3)

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

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

这也适用于null,返回false

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

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

答案 3 :(得分:2)

因为这不会编译

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();
    }
}

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

答案 4 :(得分:1)

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

我会像你第一次提出的那样做:

value.HasValue && value.Value

阅读代码的人最清楚。