3

有没有办法在 C# 中快速检查以下逻辑?

if (a)
{

}
if (b)
{

}
if (c)
{

}
else //none of the above, execute if all above conditions are false
{
  /* do something only if !a && !b && !c  */
}

这与if-else在 that 中使用不同a, b, 并且c可以同时为真,所以我不能那样堆叠它们。

我想在不写的情况下运行 else 块abc都是假的if (!a && !b && !c)。这是因为当 if 条件变得更复杂时,代码会变得非常混乱。它需要重写大量代码。

这可能吗?

4

3 回答 3

4

首先,,else块只尊重它们上面if的子句,所以你需要一个替代方案。

这个选项不是特别“干净”,但我会这样做:

bool noneAreTrue = true;
if(a)
{
    noneAreTrue = false;
}
if(b)
{
    noneAreTrue = false;
}
if(c)
{
    noneAreTrue = false;
}
if(noneAreTrue)
{
    //execute if all above conditions are false
}

另外,如果你的条件非常大,我推荐 Robert C. Martin 的 Clean Code 一书中的规则 G28(封装条件)。

非常冗长,但在某些情况下更容易阅读:

public void YourMethod()
{
    if(SomeComplexLogic())
    {
    }
    if(SomeMoreLogic())
    {
    }
    if(EvenMoreComplexLogic())
    {
    }
    if(NoComplexLogicApply())
    {
    }
}

private bool SomeComplexLogic(){
    return stuff;
}

private bool EvenMoreComplexLogic(){
    return moreStuff;
}

private bool EvenMoreComplexLogic(){
    return evenMoreStuff;
}

private bool NoComplexLogicApply(){
    return SomeComplexLogic() && EvenMoreComplexLogic() && EvenMoreComplexLogic();
}
于 2013-06-06T02:32:36.340 回答
1

如何结合策略和规范的概念

var strategies = _availableStrategies.All(x => x.IsSatisfiedBy(value));
foreach (var strategy in strategies)
{
    strategy.Execute(context);
}
if (!strategies.Any()) {
    // run a different strategy
}
于 2013-06-06T02:40:56.720 回答
1

我不会将一些复杂的条件封装在一个您只会调用一次或两次的方法中,而是将其保存在一个变量中。这也比其他答案建议的使用一些标记布尔值更具可读性。

一个人为的例子,

bool isBlue = sky.Color == Colors.Blue;
bool containsOxygen = sky.Atoms.Contains("oxygen") && sky.Bonds.Type == Bond.Double;
bool canRain = sky.Abilities.Contains("rain");
if(isBlue)
{
}
if(containsOxygen)
{
}
if(canRain)
{
}
if(!isBlue && !containsOxygen && !canRain)
{
}

现在我们已经将原本可能很复杂的条件抽象为可读的英语!

于 2013-06-06T04:03:27.270 回答