C# 编写if-else块的更好方法

C# 编写if-else块的更好方法,c#,.net,if-statement,C#,.net,If Statement,我有下面的代码示例代码,非常好用。 我只是想,如果有其他更好的方法,我们可以用更少的代码更准确地编写下面的代码片段 if(language == "English") { if(Student_id == 0) { someFunction(); } else { if(getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)

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

if(language == "English")
{
    if(Student_id == 0)
    {
        someFunction();
    }
    else
    {
        if(getMarks(Student_id) > 50 || subjectCount > 1 || projectCount > 0)
        {
            someFunction();
        }
    }
}
另外,请注意,如果Student_id为0,getMarksStudent_id将抛出错误

有关更复杂的场景,请查看

我对你的情况的建议是:

使用嵌套较少的if-else块写入

一种方法是通过反转条件和 尽可能提前归还 在您的案例中,将条件与相同的操作组合为someFunction

利用中实现的,也可以用许多其他编程语言实现的,正如在他的评论中所指出的

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!=英文声明:

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
}
但这并不好:


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

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();
}

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

如果第一个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
{
}
如果还有别的办法,你可以这样做

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

这更适合于。是someFunction;两行中的功能相同?@nvoigt是的,这是相同的功能我很抱歉!!我在代码中遗漏了一个条件。请看我的编辑,我道歉!!我在代码中遗漏了一个条件。请看我的编辑是的。反转if以减少嵌套是一种好方法+1.@user2946329啊,是的。我也喜欢这个把戏@MicrosoftDN如果Student_id==0,则getMarksStudent_id将不会得到评估。。。这只是C语言特有的行为,我想其他语言会有所不同languages@Martheen我懂了。。。我还记得我以前的日子,那时我必须用C为C8051微控制器编码,至少在那个时候是不受支持的;这里,如果Student_id为0,则getMarks不会执行getMarksStudent_id,因为如果Student_id为0,则不会计算其他条件。