编写if-else块的更好方法

Mic*_* DN 0 .net c# if-statement

我有以下代码(示例代码),它非常有效.我想如果还有其他更好的方法,我们可以用更少的代码更准确地编写以下代码片段.

if(language == "English")
{
    if(Student_id == 0)
    {
        someFunction();
    }
    else
    {
        if(getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)
        {
            someFunction();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意,如果Student_id0,getMarks(Student_id)抛出错误

Ian*_*Ian 11

(有关更复杂的情况,请查看此内容)

我建议您的案例是:

  1. 用较少的嵌套if-else块写它

    • 一种方法是通过颠倒条件
    • 给人早日回归尽可能
  2. 将条件与相同的操作结合起来(在您的情况下是someFunction)

  3. 利用在C#中实现的短路评估(也在许多其他编程语言中实现 - 如Martheen在他的评论中所述).

    if(language != "English")
        return; //assuming nothing below
    
    if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)
        someFunction(); //if someFunction is identical, this can be done
    
    Run Code Online (Sandbox Code Playgroud)

    如果您要检查其他语言,或者如果您要根据自己的行为独立完成某些事情language == "English",那么您不应该在if (language != "English")声明中返回:

    if(language == "English") {
        if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)
            someFunction(); //if someFunction is identical, this can be done
    }
    //Something else which must be done
    
    Run Code Online (Sandbox Code Playgroud)

编辑(编辑问题后):

对于附加条件,您可以简单地将其放在之后,Student_id == 0因为C#将始终首先评估最左边的if条件(对于其||短路评估).

为了说明:对于你的情况,这是好的:

if(Student_id == 0 || getMarks(Student_id) > 50){ 
    //if Student_id == 0 is true, then getMarks(Student_id) wouldn't get evaluated
}
Run Code Online (Sandbox Code Playgroud)

但这不是好事:

if(getMarks(Student_id) > 50 || Student_id == 0){ 
    //if Student_id is 0, then getMarks(Student_id) would throw exception before Student_id == 0 is evaluated
}
Run Code Online (Sandbox Code Playgroud)