是否嵌套if语句

时间:2010-06-17 09:38:36

标签: c# if-statement

我希望以前没有问过这个问题。

我有一个名为boolIsAllowed的可空布尔值和一个if条件,如下所示:

if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
 //do something
}

我的问题是这个好的代码还是我会更好地将它分成嵌套的if语句?如果boolIsAllowed.HasValue等于false然后抛出异常,是否会检查第二个条件?

我希望这个问题不是太愚蠢。

提前致谢。

7 个答案:

答案 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明确地执行此操作。