在 C# 中使用带有多个 if 语句的 else

Posted

技术标签:

【中文标题】在 C# 中使用带有多个 if 语句的 else【英文标题】:Using one else with multiple if statements in C# 【发布时间】:2013-06-01 21:52:10 【问题描述】:

有没有办法在 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 的不同之处在于abc 可以同时为真,所以我不能这样堆叠它们。

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

这可能吗?

【问题讨论】:

【参考方案1】:

首先,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();

【讨论】:

【参考方案2】:

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

var strategies = _availableStrategies.All(x => x.IsSatisfiedBy(value));
foreach (var strategy in strategies)

    strategy.Execute(context);

if (!strategies.Any()) 
    // run a different strategy

【讨论】:

复杂情况下没问题,但可能不是只有 3 个案例。 引用问题“这是因为当 if 条件变得更复杂时,代码会变得非常混乱。它需要重写大量代码。”其他解决方案很丑陋,对可维护性没有帮助。您也可以只使用 Func 和/或 Actions 而不是我提供的解决方案,这可能会简化实现 是的,我喜欢你的解决方案,我认为它是最干净的,这就是我赞成它的原因。但是要使用它,您确实需要确保有一个复杂的场景,因为在简单的情况下,背后的所有工作可能都不值得。也许您可以在答案中展示 IStrategy 的实现。【参考方案3】:

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

一个人为的例子,

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)


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

【讨论】:

以上是关于在 C# 中使用带有多个 if 语句的 else的主要内容,如果未能解决你的问题,请参考以下文章

C#判断 判断语句

C#判断 判断语句

C# 判断

MySQl 错误 #1064 存储过程 IF ELSE 带有多个 SELECT 语句

PHP 结构语句

C语言速查手册:分支语句(Decision Making)