写if-else块的更好方法

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

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

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

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

我建议您的案例是:

  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(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块不提供任何替代方案,实际上调用相同的function。 在这种情况下,不需要另一个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 { }