2010-06-17 175 views
6

我希望这之前没有问过。嵌套的if语句

我有一个名为boolIsAllowed可空布尔和条件,如果像这样:

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

我的问题是很好的代码或我会更好,其分离成一个嵌套的if语句?如果boolIsAllowed.HasValue等于false然后抛出一个异常,第二个条件是否会被检查?

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

在此先感谢。

+2

作为我的回答状态 - 并没有其他人所指出的那样 - 为空的布尔值,你可以使用GetValueOrDefault(假),这样就避免了在两个测试你的代码无论如何 – 2010-06-17 10:32:30

回答

18

没关系原样。如果HasValue为假,则检查第二个条件将不检查,所以它不会抛出异常。这就像这样的事情:

string name = ...; 
if (name != null && name.Length > 5) 

再次,这很好 - 你不会得到一个NullReferenceException如果name是空的,因为& &是短路

同样,运算符是短路的,但是相反 - 如果左边的操作数是true,则整个表达式的计算结果为true,而不检查右边的操作数。例如:

// Treat null as if it were an empty string 
if (name == null || name.Length == 0) 

编辑:正如在评论中指出,这仅适用于& &和|| - 它适用于&和|,它总是评估两个操作数。

+1

OMG - Jon Skeet回答了我的问题,并说我的代码很好......这一天是史诗! :)非常认真,谢谢。 – 2010-06-17 09:47:09

+1

你知道吗,他看起来无所不知,实际上不是神吗? – 2010-06-17 10:00:11

+2

BLASPHEMY! * SCNR * – Bobby 2010-06-17 10:07:02

0

你可以这样做:

if(boolIsAllowed.GetValueOrDefault(false)) 
{ 

} 

但是你原来的代码不会抛出异常,因为如果第一个测试失败,那么整个测试铺位,因为& &是“也”,所以如果第一次测试是错误的,测试无法成功。

6

什么:

if (boolIsAllowed ?? false) 
{ 
} 
0

如果第一个操作数的计算结果为真,第二个操作数只计算了。没有必要嵌套if陈述。

8

您可以检查真正的价值,即使它是空:

bool? val = null; 
if(val == true) // Works 
{ 
    //do something 
} 
+0

好的一个,但一个应该确保了解[详细](http://stackoverflow.com/questions/447408/why-do-nullable-bools-not-allow-ifnullable-but-do-allow- ifnullable真)。 – 2010-06-17 10:28:20

0

你很安全。 C#短路布尔表达式,这就是为什么:

如果(!列表= NULL & & list.Count> 0)

作品。代码不会费劲地试图评估第二个条件,因为它知道它不可能是真的,因为第一个结果是错误的。

并非所有的语言都这样做,很多都是。在VB中。你必须使用OrElse和AndAlso明确地完成它。

1

更一般地说,如果您在if语句中有多个条件,请考虑将它们提取到方法中。在这个具体的例子中,这并不是真正必要的,因为其他一些答案已经证明。但在更复杂的情况下,它可以更简单。你是否愿意维护:

if (taxApplied && taxValue > minimumTax && customerIsPreferred) 
{ 
    // Do something 
} 

if (CustomerGetsTaxRebate()) 
{ 
    // Do Something 
}