编写if-else块的更好方法

本文关键字:更好 方法 if-else 编写 | 更新日期: 2023-09-27 18:31:13

我有以下代码(示例代码),效果很好。我只是认为,如果有其他更好的方法,我们可以用更少的代码更准确地编写以下代码片段。

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

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

编写if-else块的更好方法

(有关更复杂的场景,请查看此内容)

我为您的情况建议是:

  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
    

    但是,如果您有其他语言要检查,或者您有一些事情要独立于基于 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
    
编辑

(编辑问题后):

对于附加条件,您可以简单地将其放在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
}

但这是不行的:

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
}

在可读性方面,有时为您的条件提供可读的名称会有所帮助:

var languageIsEnglish = language == "English";
var studentIdIsNotSet = Student_id == 0;
var hasMoreThanOneSubject = subjectCount > 1;
var hasProjects = projectCount > 0;
if(languageIsEnglish && (studentIdIsNotSet || (hasMoreThanOneSubject  || hasProjects )))
{
  someFunction();
}

这可能有效;

if(language == "English" && (Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0))
{
   someFunction();
}
if(language == "English")
{
    if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)
    {
        someFunction();
    }
}

你的 else 块不提供任何替代方案,实际上调用相同的函数。在这种情况下,不需要另一个 if 块。

如果第一个没有其他内容,如果我认为你可以像这样写一行

if(language == "English" && (Student_id == 0 || (getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)))
    someFunction();

如果有其他你可以这样做

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