编写if-else块的更好方法

时间:2016-01-21 08:45:24

标签: c# .net if-statement

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

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

此外,请注意,如果Student_id0getMarks(Student_id)会引发错误

5 个答案:

答案 0 :(得分:11)

(有关更复杂的情况,请查看this

我建议你的案例是:

  1. 使用较少嵌套的if-else

    来编写它
    • 一种方法是通过反转条件
    • 尽可能提前
  2. 将条件与相同的操作相结合(在您的情况下为someFunction

  3. 利用Short Circuit Evaluation中实现的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
    
  4. 编辑(编辑问题后):

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

答案 1 :(得分:4)

就可读性而言,有时可以为您的条件提供可读的名称:

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

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

答案 2 :(得分:2)

这可能有用;

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

如果我认为你可以像这样写一行

,那么第一个没有别的
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
{
}