我希望以前没有问过这个问题。
我有一个名为boolIsAllowed的可空布尔值和一个if条件,如下所示:
if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
//do something
}
我的问题是这个好的代码还是我会更好地将它分成嵌套的if语句?如果boolIsAllowed.HasValue等于false然后抛出异常,是否会检查第二个条件?
我希望这个问题不是太愚蠢。
提前致谢。
答案 0 :(得分:18)
一切都很好。如果HasValue
为false,则不会检查第二个条件,因此它不会抛出异常。就像这样的事情:
string name = ...;
if (name != null && name.Length > 5)
同样,没关系 - 如果name
为空,你就不会得到NullReferenceException,因为&&是短路。
同样是||运算符是短路的,但是反过来 - 如果左手操作数是 true ,则整个表达式的计算结果为true而不检查右手操作数。例如:
// Treat null as if it were an empty string
if (name == null || name.Length == 0)
编辑:正如评论中所述,这仅适用于&&和|| - 不适用于&和|,它总是评估两个操作数。
答案 1 :(得分:8)
即使它为空,您也可以检查真值:
bool? val = null;
if( val == true ) // Works
{
//do something
}
答案 2 :(得分:6)
怎么样:
if (boolIsAllowed ?? false)
{
}
答案 3 :(得分:1)
更一般地说,如果if语句中有多个条件,请考虑将它们提取到方法中。在这个具体的例子中,这并不是必要的,因为其他一些答案已经证明了这一点。但在更复杂的情况下,它可以更简单。你愿意维持:
if (taxApplied && taxValue > minimumTax && customerIsPreferred)
{
// Do something
}
或
if (CustomerGetsTaxRebate())
{
// Do Something
}
答案 4 :(得分:0)
你可以这样做:
if(boolIsAllowed.GetValueOrDefault(false))
{
}
但是你的原始代码不会抛出异常,因为如果第一次测试失败,那么整个测试就会出现问题,因为&&是'也是',所以如果第一次测试是假的,那么测试就无法成功。
答案 5 :(得分:0)
仅在第一个操作数计算为true时才计算第二个操作数。无需嵌套if
语句。
答案 6 :(得分:0)
你这样做很安全。 C#短路布尔表达式,这就是为什么:
if(list!= null&& list.Count> 0)
作品。代码不会费心去尝试评估第二个条件,因为它知道它不可能是真的,因为第一个结果是错误的。
并非所有语言都这样做,很多人都这样做。在VB.NET中,您必须使用OrElse和AndAlso明确地执行此操作。