我有一段代码,用于检查布尔变量是否为真,并根据条件,我相应地执行操作:
bool result = true;
bool isTrue = false;
CheckIsTrue(ref isTrue);
if (result)
{
if (isTrue)
//Perform action
}
如果变量设置为false,则我需要执行其他操作:
if (result)
{
if (isTrue)
{
//Perform action
}
else if(actionType == 6)
{
//Perform action, isTrue = false.
}
}
出于可读性和可维护性的原因,我决定将以上内容更改为:
if (result)
{
switch (isTrue)
{
case true:
//perform action on isTrue
break;
default:
switch (actionType)
{
case 6:
//Perform action on 6
break;
default:
//Perform default action
break;
}
break;
}
}
我的问题是:对布尔变量使用swicth.. case...
是否明智?
这是我考虑过简化代码的最佳方法,但是我不确定这的正确性。
答案 0 :(得分:2)
我认为switch
语句不是布尔变量的好选择。只需比较以下代码:
if(boolVariable)
{
//...
}
else
{
//...
}
等价
switch(boolVariable)
{
case true:
//...
break;
case false: // or default:
//...
break;
}
IMO if
语句更清晰,可读性和可维护性:)
答案 1 :(得分:2)
只有一层缩进和适当的变量名:
if (!actionShouldBePerformed) // instead of result
return;
if (defaultActionShouldBePerformed) // insted of isTrue
{
//Perform action
return;
}
if (actionType == ActionType.NameOfType) // instead of magic number 6
// Perform another action
答案 2 :(得分:1)
在我看来,第一个代码比那个怪物更具可读性。如果您使用的是C#7或更高版本,则可以编写如下代码:
switch (result)
{
case true when isTrue:
//Here is the code when both result and isTrue are true
break;
case true when actionType == 6:
//Here is the code when both result and actionType is 6
break;
default:
//Here defaultaction
break;
}
答案 3 :(得分:1)
这不是真的错误,但是我不认为最后一个代码块更具可读性。
就个人而言,我会坚持使用if ... else
,就像这样:
if (result) {
if (isTrue) {
// perform action
return;
} else if (actionType == 6) {
isTrue = false;
// perform action
return;
}
// perform default action
}
答案 4 :(得分:1)
我不会将switch子句用于布尔值。您的代码更具可读性的形式是:
if (!result)
return;
if (isTrue)
{
// do action
}
else if (actionType == 6)
{
// do something
}
else
{
// do the default action
}
但这不是OOP代码的一个很好的例子,我建议您阅读SOLID原则。
答案 5 :(得分:0)
谢谢大家的帮助!由于多种原因,我最终要做的是:
if (result)
{
if (isTrue)
{
//Perform action
}
else
{
switch (actionType)
{
case 6:
//Perform action on 6
break;
default:
//no condition mathed - write to log
break;
}
}
}
我确实喜欢这种方法,原因是:
第一-如果actionType
变量的类型发生变化,我要做的只是大小写更改,而不是在else-if
子句中处理它。
第二,如果添加了其他条件,我只需要添加另一种情况,而不是多年来构建大型嵌套的else-if
子句。
第三-如果不区分大小写,则在默认大小写之内更容易维护日志记录。
我在周末考虑了所有答案,并接受了@Sergey Berezovskiy的答案,因为他发布的答案和链接帮助我得出了我的最终结论。