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