首页 > 解决方案 > 有没有更好的方法来减少 if 语句

问题描述

我是 C# 新手,当我有很多 if 语句时,我不确定如何优化代码。所以直到现在我有

 if (input.Contains("triangle"))
 {
     if (input.Contains("rectangular"))
     {

     }
     else if (input.Contains("isosceles"))
     {

     }
     else if (input.Contains("equilateral"))
     {

     }
}

我不确定我该怎么做。

有没有更好的方法来减少 if 语句?

标签: c#

解决方案


给定的代码已经适合它的目的。这里不需要过早的优化。然而,我会给你一个关于 if 语句何时需要改写的想法。

示例问题:

验证输入。有效输入不得包含空格或点。除了 7 之外的数字也是允许的。

不太好的代码:

bool validate(String str) {
    // "!" is read as "not". True becomes false, and vice-versa
    if (!(str.Contains(" "))){
        if (!(str.Contains("."))){
            if (!(str.Contains("7"))){
                Console.WriteLine("Success");
                 return true;
            }
        }
    }
    return false;
}

这就是你所说的嵌套条件。太多嵌套的 if 语句可能会令人眼花缭乱,这时您需要修复它。虽然嵌套的 if 语句并不总是坏事,但考虑将它们分开的方法通常是个好主意,这样主代码就不会缩进很深。(在这种情况下,您可能会争论使用“||”(“或”运算符)或“&&”(“和”运算符)将条件组合成一个 if 语句。这没有错,但在更复杂的逻辑中,你会经常想要分离条件以便于调试。)

稍微好一点的代码:

bool validate(String str) {
    // "!" is read as "not". True becomes false, and vice-versa
    bool isValid = true;
    if (str.Contains(" ")){
        isValid = false;
    }
    if (str.Contains(".")){
        isValid = false;
    }
    if (str.Contains("7")){
        isValid = false;
    }
    if (isValid){
        Console.WriteLine("Success");
    }
    return isValid;
}

另一种策略是使用提前退出。它基本上意味着首先检查不需要的情况,如果发现这种情况,立即返回false。

更好的代码:

bool validate(String str) {
    // Since we are checking for unwanted cases, we won't use the not operator
    if (str.Contains(" ")){
        return false;
    }
    if (str.Contains(".")){
        return false;
    }
    if (str.Contains("7")){
        return false;
    }
    // You could also do 
    // if (str.Contains(" ") || str.Contains(".") || str.Contains("7")) if you want

    // Notice how the main code is not within any if-statement
    Console.WriteLine("Success");
    return true;
}

综上所述:

  • 避免不必要的嵌套条件

  • 如果可能的话,分开条件。

  • 利用提前退出

  • 许多 if 语句都可以,特别是如果您的程序需要处理许多情况。不要偏执地花费 75% 的时间来尝试进行过早的优化。if 语句的更改不会导致速度上的很大差异。但是,使它们更整洁确实会给阅读您的代码的程序员(可能包括您)带来很大的不同。


推荐阅读