在c#中使用一个else和多个if语句
本文关键字:else 一个 语句 if | 更新日期: 2023-09-27 18:17:14
是否有一种方法可以快速检查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
的不同之处在于,a
, b
和c
可以同时为真,所以我不能那样堆叠它们。
我想在a
, b
和c
都为false时运行else块,而不写if (!a && !b && !c)
。这是因为当if条件变得更复杂时,代码会变得相当混乱。它需要重写大量的代码。
这可能吗?
首先,没有, 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();
}
如何将策略和规范的概念结合起来
var strategies = _availableStrategies.All(x => x.IsSatisfiedBy(value));
foreach (var strategy in strategies)
{
strategy.Execute(context);
}
if (!strategies.Any()) {
// run a different strategy
}
与其将一些复杂的条件封装在只调用一两次的方法中,不如将其保存在一个变量中。这也比其他答案所建议的使用一些标记布尔值更具可读性。
一个人为的例子,
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)
{
}
现在我们已经将复杂的条件抽象成可读的英语!