布尔变量的C#开关子句

时间:2018-12-20 12:19:33

标签: c# switch-statement boolean

我有一段代码,用于检查布尔变量是否为真,并根据条件,我相应地执行操作:

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...是否明智? 这是我考虑过简化代码的最佳方法,但是我不确定这的正确性。

6 个答案:

答案 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   

进一步阅读:Replace Nested Conditional with Guard Clauses

答案 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的答案,因为他发布的答案和链接帮助我得出了我的最终结论。