具有多个条件的If语句与单个If语句

时间:2020-06-02 13:15:21

标签: c#

我想检查每个条件,如果是,则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;
}

如果myStrEmpty

我的想法是,第一种方法在到达return之前(或确实)检查所有3个条件?

第二种方法只需要检查第一个条件string.IsNullOrEmpty,到达return,而不必处理它下面的其他2个条件检查。


还是不管源代码如何编写,编译器都会优化代码以使其最有效地工作?

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一样,但是还会检查字符串是否仅包含空格,制表符等,而不包含任何内容。