我想检查每个条件,如果是,则return
。
最好是:
1。。在单个if
语句中有多个条件?
if (string.IsNullOrEmpty(myStr) ||
myBool == true ||
myList.Count == 0)
{
return;
}
2。或多个if
语句,每个语句检查不同的条件。
if (string.IsNullOrEmpty(myStr))
{
return;
}
if (myBool == true)
{
return;
}
if (myList.Count == 0)
{
return;
}
如果myStr
是Empty
。
我的想法是,第一种方法在到达return
之前(或确实)检查所有3个条件?
第二种方法只需要检查第一个条件string.IsNullOrEmpty
,到达return
,而不必处理它下面的其他2个条件检查。
还是不管源代码如何编写,编译器都会优化代码以使其最有效地工作?
答案 0 :(得分:3)
它们是等效的。 ||
运算符发生短路,因此一旦达到条件true
,它将停止检查其他条件并返回true
。
|
运算符不会不会短路,因此它会在返回值之前先评估每个操作数。
&&
和&
相同,但false
相同。一旦达到错误条件,&&
运算符就会返回false。
因此,您的两种方法在功能上是相同的。使用您认为最干净,最容易推断意图的一种,等等。
还是不管源代码如何编写,编译器都会优化代码以使其最有效地工作?
好吧,优化器可以更改代码以提高效率,但是它不能更改功能行为,这意味着它不会更改操作的 order 。假设您有类似的东西:
if ((x == 0) || (y/x > 1))
这是防止被零除错误的常用方法。如果编译器可以重新排列操作数,则可能会引入除零错误。
答案 1 :(得分:2)
这确实是一个优先事项,因为两者都会导致相同的整体性能。两者彼此相等。默认情况下,C#使用短路评估,这意味着if
语句将在找到计算结果为true
的表达式后立即停止。在大多数情况下,我已经看到它是作为单个if
语句编写的,但是如果您想在特定条件之一上设置断点,则单独进行检查可能更易于调试。
还要注意,尽管if (myBool == true)
可以使用,但是您不必将其明确地等同为true。 if
语句仅需求值为true
,因此您可以将其写为if (myBool)
。同样,这是个人喜好,但它更短并且可以使阅读更容易。
最后,您可能会考虑使用string.IsNullOrWhiteSpace
,就像string.IsNullOrEmpty
一样,但是还会检查字符串是否仅包含空格,制表符等,而不包含任何内容。