我刚刚在同事代码中遇到过这个问题。他有一个可以自负的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()
}
编辑:我浏览了两种方法,它们看起来都是一样的。我问的是哪一个是正确的方法,如果需要额外的检查?
现在我正在质疑我和我的同事代码。我在这里做这个额外的检查有什么意义吗?或者我可以安全地做第一种方式吗?
谢谢(是的,我确实搜索了这个!:))
答案 0 :(得分:8)
实际上,我不建议您将null
视为false
。使用非可空布尔值,或显式处理null
值。还有一个选择:
if (foo ?? false)
{
}
答案 1 :(得分:6)
我会用它。
bool IsTrue(bool? value)
{
return value.GetValueOrDefault();
}
仅当null
或false
和true
具有值且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
阅读代码的人最清楚。