【问题标题】:Better way to write if-else block [closed]编写 if-else 块的更好方法 [关闭]
【发布时间】:2016-01-21 08:45:23
【问题描述】:

我有以下代码(示例代码),效果很好。 我只是想如果有任何其他更好的方法,我们可以用更少的代码更准确地编写以下代码 sn-p。

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

另外,请注意如果Student_id0getMarks(Student_id) 会抛出错误

【问题讨论】:

  • 这个更适合Code Review
  • 是“someFunction();”两行的功能一样吗?
  • @nvoigt 是的,功能相同
  • 我很抱歉!!我错过了代码中的一个条件。请看我的编辑

标签: c# .net if-statement


【解决方案1】:

(对于更复杂的场景,请查看this

我对你的情况的建议是:

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

    • 一种方法是反转条件
    • 尽可能提前返回
  2. 将条件与相同的操作结合起来(在您的情况下是someFunction

  3. 利用在C# 中实现的Short Circuit Evaluation(也在许多其他编程语言中实现 - 正如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 条件(对于它的 || short circuit evaluation)。

为了说明:对于你的情况,这没关系:

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
}

【讨论】:

  • 我很抱歉!!我错过了代码中的一个条件。请看我的编辑
  • 是的。反转if 以减少嵌套是一个好方法。 +1。
  • @user2946329 啊,是的。我也喜欢这个把戏。 :)
  • @Martheen 我明白了...我记得我以前必须用 C 语言为 C8051 微控制器编写代码,至少当时不支持它.. ;)
【解决方案2】:

就可读性而言,有时为条件提供可读名称会有所帮助:

var languageIsEnglish = language == "English";
var studentIdIsNotSet = Student_id == 0;
var hasMoreThanOneSubject = subjectCount > 1;
var hasProjects = projectCount > 0;

if(languageIsEnglish && (studentIdIsNotSet || (hasMoreThanOneSubject  || hasProjects )))
{
  someFunction();
}

【讨论】:

    【解决方案3】:

    这可能有效;

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

    【讨论】:

    • 这里,如果Student_id为0,getMarks抛出错误
    • 不会执行getMarks(Student_id),因为如果Student_id0,则不会评估其他条件。
    【解决方案4】:
    if(language == "English")
    {
        if(Student_id == 0 || getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)
        {
            someFunction();
        }
    }
    

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

    【讨论】:

      【解决方案5】:

      如果第一个没有别的,如果我认为你可以像这样写成一行

      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
      {
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 2015-11-09
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-19
        相关资源
        最近更新 更多