C# 在方法返回的If-Else语句中,如果可以隐式地跟随Else,是否应该显式地声明它?

C# 在方法返回的If-Else语句中,如果可以隐式地跟随Else,是否应该显式地声明它?,c#,if-statement,C#,If Statement,我有一个方法可以检查某些东西,并根据这些检查返回一个布尔值。它涉及一个单独的分支If部分,它按顺序检查大约5个条件。如果这些条件中的任何一个返回true,那么该方法将返回true。如果没有一个条件返回true,那么该方法将返回false。由于If部分后面的代码仅在所有条件均为true时运行,因此该代码在逻辑上与包含实际Else语句相同 那么,对于这种情况,在Else语句中写出来是不是更好呢 编辑 事实证明,我需要关于哪些条件实际上会使其中一些条件的“true”失效的信息,因此我更改了方法以返回i

我有一个方法可以检查某些东西,并根据这些检查返回一个布尔值。它涉及一个单独的分支If部分,它按顺序检查大约5个条件。如果这些条件中的任何一个返回true,那么该方法将
返回true。如果没有一个条件返回true,那么该方法将
返回false。由于If部分后面的代码仅在所有条件均为true时运行,因此该代码在逻辑上与包含实际Else语句相同

那么,对于这种情况,在Else语句中写出来是不是更好呢

编辑

事实证明,我需要关于哪些条件实际上会使其中一些条件的“true”失效的信息,因此我更改了方法以返回int,其中-1表示“false”情况。逻辑仍然存在,如果没有一个条件为真,它将返回-1。因此,我不再有
return(cond1 | | | cond2 | | cond3 | | cond4 | | cond5)的可压缩选项,但我也感谢大家的建议,因为我确实没有考虑它(主要是因为cond3是一个非常复杂的条件,涉及检查两对DateTime对象的中点的交点,所以它看起来很难看)。虽然这种方法的性质已经改变,但这个问题的性质并没有改变,所有的答案仍然基本适用

该代码目前是,为了解释它并删除所有定义cond1到cond5的无关代码

if (cond1) { return 1; }
else if (cond2) { return 2; }
else if (cond3) { return 3; }
else if (cond4) { return 4; }
else if (cond5) { return 5; }

最能表达您意图和/或最具可读性的内容

以下所有选项都完全有效:

if (condition1)
    return true;
if (condition2)
    return true;
if (condition3)
    return true;
return false;


如果条件非常重要或者
if
分支中有多个语句,我倾向于使用前两个选项。如果条件不太复杂,最后一个选项可以提供更简洁的代码。

这实际上是一个风格问题,您(以及您的同事)发现什么更清晰。一般来说,我个人认为结构:

if( a )
   someResult = doSomething();
else if( b )
   someResult = doSomethingElse();
else
   someResult = doSomethingAnyways();

return someResult;
比:

if( a )
    return doSomething();
if( b )
    return doSomethingElse();
return doSomethingAnyways();

在没有实际查看代码的情况下,很难说清楚,但是考虑到您有许多条件会产生
true
,因此可能更清楚的方法是让代码通过并最终返回false结尾处:

public bool MyComplicatedTest()
{
    if (complicated_condition1)
    {
        return true;
    }

    if (complicated_condition2)
    {
        return true;
    }
    ....

    return false;
}

听起来你是在问:

if ((condition1) ||
   (condition2) ||
   (condition3) ||
   (condition4) ||
   (condition5) )
{
   return true;
}
else
{  return false;
}
可以转化为:

if ((condition1) ||
   (condition2) ||
   (condition3) ||
   (condition4) ||
   (condition5) )
{
  return true;
}
return false;

请考虑这一点:

return
   (condition1) ||
   (condition2) ||
   (condition3) ||
   (condition4) ||
   (condition5);

这纯粹是风格和品味的问题

我个人的偏好是,仅当存在非此即彼的情况时,才包括else

if (SomeCondition())
    return "Boxers";
else
    return "Briefs";
如果一个方法中有多个返回,那么我将省略最后一个else

if (!OvenOn())
    return false;
if (timeRemaining <= 0d)
    return false;
if (DoorOpen())
    return false;
return true;
if(!OvenOn())
返回false;

如果(剩余时间与返回硬值相比,我更喜欢这样的东西

static bool SomeFunc(string arg)
{
    bool result = false;

    if (arg.Length < 10)
    {
        result = true;
    }
    else if (arg.StartsWith("foo"))
    {
        result = true;
    }

    if (!result && arg.EndsWith("foo"))
    {
        result = true;
    }

    return result;
}
static bool SomeFunc(字符串arg)
{
布尔结果=假;
如果(参数长度<10)
{
结果=真;
}
else if(参数StartsWith(“foo”))
{
结果=真;
}
if(!result&&arg.EndsWith(“foo”))
{
结果=真;
}
返回结果;
}

就我个人而言,我通常更喜欢使用ELSE,因为我认为它可以让意图更清晰。如果你

if (sensorScan()==ENEMY)
  return FIRE_PHASERS;
else
  return SEND_GREETING;
读者很清楚,您处理的是来自一个条件的两个分支。当然,在这样一个简单的情况下,每个分支只有一行,这可能是显而易见的。但在现实生活中,IF和许多条件中通常有一块由许多行代码组成的块,因此读者可能不会立即看到它每个块都以返回结束,因此,只有在所有先前的条件都为false时,才执行最后一个块

我对这种做法的一个例外是当代码嵌套得很深时。当它开始在页面上爬行太远时,我经常发现删除ELSE更具可读性


另一个例外是当一个条件是奇数,另一个条件是主线时。是的,这完全是主观的,但在这种情况下,如果可能的话,我更喜欢将主线置于其他条件之外。

我同意这是一个风格问题,我个人更喜欢与你喜欢的相反!上面的后一个选项更干净、更安全代码更少,因此我更喜欢它。第一个选项更容易重构为新方法,这就是为什么它更好的原因。我倾向于在可能的情况下从方法中选择一个单一的退出点,而不使代码的逻辑复杂化。我发现具有单一退出点的方法更容易理解、重构和维护。还有这是一个放置断点的方便位置,在允许继续执行流之前,您仍然可以在此处调整返回值。IMO这是将其缩短为
return(arg.Length<10)| | arg.StartsWith(“foo”)| | arg.EndsWith(“foo”)的理想选择
当然可以,但这些不是我所说的实际条件。我的目的是,我认为最好为返回结果和过程设置一个默认值,而不是到处散布返回语句。我不认为拥有多个返回语句是错误的,只是认为拥有大量返回语句会损害清晰性,而且也使调试变得更加困难。查看每个人的答案…再次感谢大家!每个人的答案都很有帮助且正确。我已经做出了与实际实现相匹配的选择,我发现自己同意在开始时初始化默认值。再次感谢你!Jay,你有任何url我可以与我的同事共享吗?他没有sn不明白if-else链接的意义,也不明白为什么它们不能只是独立的if语句。我告诉他
else
有语义,但我不明白,我想知道是否有更好的措辞方式。
static bool SomeFunc(string arg)
{
    bool result = false;

    if (arg.Length < 10)
    {
        result = true;
    }
    else if (arg.StartsWith("foo"))
    {
        result = true;
    }

    if (!result && arg.EndsWith("foo"))
    {
        result = true;
    }

    return result;
}
if (sensorScan()==ENEMY)
  return FIRE_PHASERS;
else
  return SEND_GREETING;