if( CND1 && CND2 && CND3 && CND4)
{
}
else
{
}
或者
if(CND1)
{
if(CND2)
{
if(CND3)
{
if(CND4)
{
}
else
{
}
}
else
{
}
}
else
{
}
}
}
if( CND1 && CND2 && CND3 && CND4)
{
}
else
{
}
或者
if(CND1)
{
if(CND2)
{
if(CND3)
{
if(CND4)
{
}
else
{
}
}
else
{
}
}
else
{
}
}
}
由于它采用了短路技术(即在找到假参数后就停止检查),因此性能是相同的,因此一定要选择第一个选项。与其他10行代码相比,仅需一行代码。这也意味着您的else
语句将更容易处理。
if (x && y) // x and y are related
{
if (a && b) // a and b are related
{
}
}
虽然有一个更易读的替代方案(但是必须承认它会评估更多的条件):
bool shouldPayBackDebt = x && y;
bool haveEnoughFunds = a && b;
if (shouldPayBackDebt && haveEnoughFunds)
{
// ...
}
就性能而言,它们是相同的。&&
是短路运算符,所以如果CND1
为假,则不会评估其余部分。
C#使用短路求值,因此从性能上来看,两者应该是相同的。
在一个没有短路求值的语言中,后者可能会更有效率,但是像所有的优化一样,您应该进行基准测试以查看是否存在性能提升,并决定是否值得使代码变得更加复杂和难以维护。
此外,这种“优化”实际上可能并不是一种优化。如果条件很便宜,而额外的复杂性增加了代码的大小,使其现在(例如)不再适合缓存,那么它实际上可能表现得更差!
从编码风格的角度来看,这应该真正取决于您想要对else
做什么。如果您希望在所有条件都为真时执行一件事情,在任何条件为假时执行另一件事情,请选择前者。如果您想要根据哪些条件为假来执行不同的操作,则使用后者。
这不仅仅是风格问题,而是关于你想要实现什么。但如果你确实想要在任何一个条件为 false 的情况下做同样的事情,你应该使用第一种形式,这样就不会在每个 else 块中重复相同的代码。如果有疑问,在给定两种实现相同需求的方式时,选择最简单、最清晰、最易维护的选项总是个好主意。
哦,以防你不知道,如果你想在 C# 中急切地评估条件,可以使用 &
和 |
而不是 &&
和 ||
。所以,如果你想让所有条件都运行(可能是为了副作用),你可以这样做:
if (CND1 & CND2 & CND3 & CND4) { // Eagerly evaluate all conditions.
...
}
else {
...
}
然而,这里需要记住的一件事是,这看起来非常类似于短路版本,因此值得评论它,特别是如果C或C ++人员可能会查看代码。
另外,我发现以下懒惰结构非常有用:
ok = ok && CND;
但是严格等效看起来太相似了:
ok = ok & CND;
因此,我确保像这样的代码被重构为:
ok &= CND;
这使得行为上的差异更加明显。
else
放在哪里? - Prutswonder